在這個資料表中:
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
對于第一點(我想第二點會類似),我嘗試了我之前發布的類似問題中提到的方法(這里和這里),但沒有奏效:
dt[x==1[time == 1], x := x[time == 1], id]給出錯誤setDT(dt)[, x2:= ifelse(x==1 & time==1, x[time==1], x), by=id]改變x只在time 1(所以,沒有真正的改變觀察)
使用寬格式的 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
uj5u.com熱心網友回復:
使用累積最大值函式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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/375191.html
