根据数据框列中的条件继续进行ID编号

时间:2016-06-22 01:54:08

标签: r sorting

我有一个数据框,其结构如下(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中有没有关于如何做到这一点的技巧?

1 个答案:

答案 0 :(得分:2)

我们可以使用逻辑向量cumsumDVID==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