【发布时间】: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==1time==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
【问题讨论】:
标签: r data.table long-format-data