使用r中长格式data.table的两个变量按条件改变变量
mutate variable by condition using two variables in long format data.table in r
在此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
即
- if
x==1
at time==1
then x=1
at times 2 and 3, by id
- if
x==1
at time==2
then x=1
at time 3, by id
对于第一点(我想第二点也差不多),我已经尝试过我之前发布的类似问题中提到的方法( and ),但是none有效:
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
在上面的table中,如何做到以下几点:
- if
x=='a'
at time==1
then x='a'
at times 2 and 3, by id
- if
x=='a'
at time==2
then x='a'
at time 3, by id
使用累积最大值函数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
在此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
即
- if
x==1
attime==1
thenx=1
at times 2 and 3, byid
- if
x==1
attime==2
thenx=1
at time 3, byid
对于第一点(我想第二点也差不多),我已经尝试过我之前发布的类似问题中提到的方法(
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
在上面的table中,如何做到以下几点:
- if
x=='a'
attime==1
thenx='a'
at times 2 and 3, by id - if
x=='a'
attime==2
thenx='a'
at time 3, by id
使用累积最大值函数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