我有一个数据框,其结构如下(df
)。我想修改ID2, PERIOD
,使得ID2,PERIOD编号继续执行到AMT > 0
(注意,当AMT> 0时,EVID为0)。因此,ID2==13/PERIOD==2
的前两行实际上应该是ID2==12/PERIOD==1
数据框中显示的dfout
。如此答案。
df <-
ID ID2 TIME DVID AMT DV PERIOD
1 12 0 0 50 NA 1
1 12 0.5 1 0 10 1
1 12 0.5 2 0 15 1
1 13 600 1 0 2.5 2
1 13 600 2 0 4 2
1 13 600 0 100 NA 2
1 13 602 1 0 20 2
1 13 602 2 0 35 2
1 14 800 1 0 5 3
1 14 800 2 0 10 3
1 14 800 0 50 NA 3
dfout <-
ID ID2 TIME DVID AMT DV PERIOD
1 12 0 0 50 NA 1
1 12 0.5 1 0 10 1
1 12 0.5 2 0 15 1
1 12 600 1 0 2.5 1
1 12 600 2 0 4 1
1 13 600 0 100 NA 2
1 13 602 1 0 20 2
1 13 602 2 0 35 2
1 13 800 1 0 5 2
1 13 800 2 0 10 2
1 14 800 0 50 NA 3
在R中有没有关于如何做到这一点的技巧?
答案 0 :(得分:2)
我们可以使用逻辑向量cumsum
(DVID==0 & AMT > 0
)循环遍历列(“ID2”,“PERIOD”)来创建分组索引,我们更改{{1} }值。
unique
或使用df[c("ID2", "PERIOD")] <- lapply(df[c("ID2", "PERIOD")], function(x)
unique(x)[with(df, cumsum(DVID==0 & AMT > 0))])
df
# ID ID2 TIME DVID AMT DV PERIOD
#1 1 12 0.0 0 50 NA 1
#2 1 12 0.5 1 0 10.0 1
#3 1 12 0.5 2 0 15.0 1
#4 1 12 600.0 1 0 2.5 1
#5 1 12 600.0 2 0 4.0 1
#6 1 13 600.0 0 100 NA 2
#7 1 13 602.0 1 0 20.0 2
#8 1 13 602.0 2 0 35.0 2
#9 1 13 800.0 1 0 5.0 2
#10 1 13 800.0 2 0 10.0 2
#11 1 14 800.0 0 50 NA 3
dplyr