中如何执行此操作
我有一个数据框架,其中包括以下结构(df
)。我想修改ID2, PERIOD
,以使ID2,周期编号向前携带到AMT > 0
(请注意,当AMT> 0时,EVID为0)。因此,ID2==13/PERIOD==2
的前两行实际上应为ID2==12/PERIOD==1
,如dfout
数据框架所示。ans so on。
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?
我们可以使用逻辑向量(DVID==0 & AMT > 0
)的cumsum
循环(" ID2"," ofere")来创建分组索引,我们更改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
library(dplyr)
df %>%
mutate_each(funs(unique(.)[cumsum(DVID==0 & AMT > 0)]), DV, PERIOD)