2016-06-22 64 views
1

我有一个数据帧,其结构如下(df)。我想修改ID2, PERIOD,这样ID2,PERIOD号码会被转发到AMT > 0(注意当AMT> 0时,EVID为0)。所以,ID2==13/PERIOD==2的前两行实际上应该是ID2==12/PERIOD==1,如dfout数据帧中所示。 Ans等。基于数据帧列中的条件进行的ID编号

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中做到这一点的技巧?

回答

2

我们可以使用逻辑向量(DVID==0 & AMT > 0)的cumsum来遍历列(“ID2”,“PERIOD”)来创建分组索引,我们更改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) 
+0

对不起akrun由dplyr第二种方案没有做的工作。第一个解决方案! – Amer

+0

@Amer出于某种原因,它为我工作。 – akrun

+0

mm可能与plyr和dplyr在我的脚本中加载在一起。不用担心,我会仔细看看。谢谢。 – Amer

相关问题