使用r中的长格式data.table中的两个变量按条件改变变量
Posted
技术标签:
【中文标题】使用r中的长格式data.table中的两个变量按条件改变变量【英文标题】:mutate variable by condition using two variables in long format data.table in r 【发布时间】:2022-01-11 19:01:18 【问题描述】:在这个data.table中:
dt <- data.table(id=c(1,1,1,2,2,2), time=rep(1:3,2), x=c(1,0,0,0,1,0))
dt
id time x
1: 1 1 1
2: 1 2 0
3: 1 3 0
4: 2 1 0
5: 2 2 1
6: 2 3 0
我需要以下物品:
id time x
1: 1 1 1
2: 1 2 1
3: 1 3 1
4: 2 1 0
5: 2 2 1
6: 2 3 1
那是
-
如果
x==1
time==1
然后 x=1
在时间 2 和 3,id
如果x==1
在time==2
然后x=1
在时间3,id
对于第一点(我想第二点会类似),我已经尝试过我之前发布的类似问题(here 和 here)中提到的方法,但没有任何工作:
dt[x==1[time == 1], x := x[time == 1], id]
报错
setDT(dt)[, x2:= ifelse(x==1 & time==1, x[time==1], x), by=id]
仅在 time 1
处更改 x
(因此,没有观察到真正的变化)
使用宽格式的 data.table 会容易得多,但我一直面临长格式的这种问题,我不想一直重塑我的数据
谢谢!
编辑:
@GregorThomas dt[, x := cummax(x), by = id]
提供的答案适用于我提出的问题。
现在我对字符变量提出同样的问题:
dt2 <- data.table(id=c(1,1,1,2,2,2), time=rep(1:3,2), x=c('a','b','b','b','a','b'))
dt2
id time x
1: 1 1 a
2: 1 2 b
3: 1 3 b
4: 2 1 b
5: 2 2 a
6: 2 3 b
在上表中,如何做到以下几点:
-
如果
x=='a'
在 time==1
然后 x='a'
在时间 2 和 3,按 ID
如果 x=='a'
在 time==2
然后 x='a'
在时间 3,通过 id
【问题讨论】:
【参考方案1】:使用累积最大值函数cummax
:
dt[, x := cummax(x), by = id]
dt
# id time x
# 1: 1 1 1
# 2: 1 2 1
# 3: 1 3 1
# 4: 2 1 0
# 5: 2 2 1
# 6: 2 3 1
【讨论】:
谢谢@GregorThomas 和@GuedesBF,这行得通!但是如果x
是一个字符,这个选项就不可能了。你不知道在那种情况下可以做什么吗?
您提供了带有数字列的示例数据。请编辑您的问题以包含文本数据的代表
在其他情况下,我可能会使用cumsum
来触发条件,例如x := fifelse(cumsum(x == "A") > 1, "A", x))
。试图概括一下......以上是关于使用r中的长格式data.table中的两个变量按条件改变变量的主要内容,如果未能解决你的问题,请参考以下文章
如何在 R 中迭代地过滤列表中的列表或如何同时使用两个条件过滤 data.table,在运行时创建对象