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))]
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
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
@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