2016-06-22 4 views
1

아래 구조체 (df)가있는 데이터 프레임이 있습니다. ID2, PERIOD을 수정하여 ID2, PERIOD 번호가 AMT > 0 (AMT> 0, EVID가 0 일 때 참고)으로 이월되도록 수정하고 싶습니다. 따라서 ID2==13/PERIOD==2의 처음 두 행은 실제로 dfout 데이터 프레임에 나타나는대로 ID2==12/PERIOD==1이어야합니다. 그렇게된다.데이터 프레임 열의 조건에 따라 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에 의해 두 번째 솔루션 akrun 죄송합니다 dplyr

library(dplyr) 
df %>% 
    mutate_each(funs(unique(.)[cumsum(DVID==0 & AMT > 0)]), DV, PERIOD) 
+0

를 사용하여. 첫 번째 해결책은했습니다! – Amer

+0

@Amer 어떤 이유인지 그것은 나를 위해 일하고 있습니다. – akrun

+0

mm은 내 스크립트에서 함께로드되는 plyr 및 dplyr과 관련이있을 수 있습니다. 걱정하지 마세요. 나는 더 자세히 살펴볼 것입니다. 고맙습니다. – Amer

관련 문제