2016-06-22 62 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

相關問題