2016-11-17 1 views
1

So sieht mein Dataframe aus. NewCumV1 ist mein Wunschfeld.Ändern der kumulativen Summe mit Werten aus einem zweiten Feld

Bibliothek (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 ist nur cumsum(V1+V2) im Allgemeinen und cumsum(V1+V2)+Last Value of V3 from prior group für Zeilen, wenn die Gruppe Änderungen

So in der 5. Reihe, wenn Group. Änderungen von Group=1 zu Group=2, nehme ich die bestehende cumsum, die 11 ist und 2=V1 und 1=V2 und 2=V3, die letzten Wert von V3 von pri ist oder Group=1, zu it.So,

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

Danach ist es regelmäßig cumsum(V1+V2) wieder, bis die Group Änderungen. So aus der 6. Reihe sollte die Berechnung sein:

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

8. Reihe ist eine neue Gruppe, wo Group=3, so gibt es eine cumsum zurückgesetzt. Ich nehme die NewCumV1 aus der letzten Gruppe, die 23 ist, und fügen Sie V1=1 und V2=2 und V3=3 zu it.So,

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

ich versucht habe:

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

Für den letzten Wert in NewCumV1, ist das korrekt? Wenn Sie 'cumsum (V2)' für jede 'Gruppe' berechnen, ist der 7. Beobachtungswert 8, also erhalte ich 31 statt 23 – akrun

+0

Wenn der obige Kommentar richtig ist, dann ist 'dt [, New1: = cumsum (V2), Gruppe] [, i1: = shift ((dupliziert (Gruppe, fromLast = TRUE)) * New1, fill = 0)] [Gruppe! = 1, New1: = cumsum (i1 + V1 + V2)] [, i1: = NULL] [] ' – akrun

+0

@akrun Vielen Dank für Ihre großartige Antwort. Diese kleine Änderung 'dt [Gruppe! = 1, Neu1: = Cumsum (i1 + V1 + V2), durch = Gruppe]' am Ende deines Codes erledigt meine Arbeit. Ich werde einige Änderungen in meinem Beitrag vornehmen, um es klarzustellen. – gibbz00

Antwort

1

Vielleicht so etwas wie dieses 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

Vielen Dank für Ihre Antwort! – gibbz00

Verwandte Themen