2016-11-17 7 views
1

이것이 내 데이터 프레임의 모습입니다. 내 희망 필드는 NewCumV1입니다.두 번째 필드의 누적 합계 수정

라이브러리 (data.table) DT < - FREAD은 ('

 V1  V2 NewCumV1 Group V3 
     1  1  2   1 1 
     0  2  4   1 1 
     0  4  8   1 1 
     0  3  11   1 2 
     2  1  16   2 1 
     0  2  18   2 2 
     0  5  23   2 3 
     1  2  29   3 1 ') 

NewCumV1은 행 때 그룹 변경 일반적으로 cumsum(V1+V2)cumsum(V1+V2)+Last Value of V3 from prior group 인 5 행의 그래서

, 그룹. Group=1에서 Group=2으로 변경하면 기존의 cumsum이 11이고, 2=V11=V22=V3을 추가합니다.이 값은 V3의 마지막 값입니다. 또는 Group=1, it.So에, 그 후

NewCumV1 For New Group2 at 5th row= 11+2+1+2 = 16 

, 그것은 Group가 바뀔 때까지 정기적으로 cumsum(V1+V2)입니다. 6 행에서 그래서 계산은 다음과 같아야합니다

16+0+2=18(6th row) 
18+0+5=23(7th row) 

8 행은 새 그룹 Group=3이다, 그래서 cumsum 리셋이있다. 나는 시도

23+1+2+3=29(last row) 

, 23 V1=1V2=2 및 it.So에 V3=3을 추가 할 수있는 마지막 그룹에서 NewCumV1을 :

dt[NewCumV1:= cumsum(V1+V2)+ last(V3), by=Group))] 
+0

NewCumV1의 마지막 값은 맞습니까? 각 그룹에 대해'cumsum (V2)'를 계산하면 7 번째 관측 값은 8이므로 23 대신에 31을 얻습니다. – akrun

+0

위의 주석이 맞으면'dt [, New1 : = cumsum (V2), Group = 1, New1 : = cumsum (i1 + V1 + V2)], i1 : = shift ((그룹, fromLast = TRUE) = NULL] []' – akrun

+0

@akrun 위대한 답변에 감사드립니다. 코드의 끝에있는이 작은 변화'dt [Group! = 1, New1 : = cumsum (i1 + V1 + V2), by = Group]'은 제 일을 끝냅니다. 나는 그것을 명확하게하기 위해 나의 편집부에서 약간의 편집을 할 것이다. – gibbz00

답변

1

이 IIUW 같은 아마 뭔가 :

library(data.table) 
dt <- fread(' 

      V1  V2 NewCumV1 Group 
      1  1  1   1 
      0  2  3   1 
      0  4  7   1 
      0  3  10   1 
      2  1  13   2 
      0  2  15   2 
      0  5  20   2 
      1  2  23   3 ') 

dt[Group == 1, cus := cumsum(V2)] 
dt[Group != 1, cus := cumsum(V2+V1), by = Group] 
foo <- dt[, .(addons = cus[.N]), by = Group] 
foo[, `:=`(addons = cumsum(addons), Group = Group + 1)] 
dt <- merge(dt, foo[1:(nrow(foo)-1)], by = "Group", all = T) 
dt[, cus := rowSums(.SD, na.rm = T), .SDcols = c("cus", "addons")] 
# Group V1 V2 NewCumV1 cus addons 
# 1:  1 1 1  1 1  NA 
# 2:  1 0 2  3 3  NA 
# 3:  1 0 4  7 7  NA 
# 4:  1 0 3  10 10  NA 
# 5:  2 2 1  13 13  10 
# 6:  2 0 2  15 15  10 
# 7:  2 0 5  20 20  10 
# 8:  3 1 2  23 23  20 
+0

답변 해 주셔서 감사합니다. – gibbz00