So sieht meine Datentabelle aus:
%Vor% Die Spalte LastProductOfPriorGroup
ist meine gewünschte Spalte. Ich versuche, das Produkt aus der letzten Reihe der vorherigen Gruppe zu holen. In den ersten beiden Zeilen gibt es also keine vorherigen Gruppen und daher ist NA
. In der dritten Zeile ist das Produkt in der letzten Zeile der vorherigen Gruppe 1 B
. Ich versuche dies zu erreichen durch
ohne Erfolg.
Sie könnten
tun %Vor% Dies führt zu dem folgenden aktualisierten dt
, wobei newcol
Ihrer gewünschten Spalte mit dem unnötig langen Namen entspricht. ;)
Lasst uns den Code von innen nach außen brechen. Ich werde ...
verwenden, um den akkumulierten Code zu bezeichnen:
dt[, last(Product), by = Group]$V1
erhält die letzten Werte aus jeder Gruppe als Zeichenvektor. shift(...)
verschiebt den Zeichenvektor im vorherigen Aufruf dt[, newcol := ...[.GRP], by = Group]
groups nach Group
und verwendet die internen .GRP
-Werte für die Indizierung Update: Frank bringt einen guten Punkt über meinen Code und berechnet die Verschiebung für jede Gruppe immer und immer wieder. Um dies zu vermeiden, können wir entweder
verwenden %Vor%, damit wir die Verschiebung für jede Gruppe nicht berechnen. Oder wir können Franks netten Vorschlag in den Kommentaren nehmen und folgendes tun:
%Vor%Eine andere Möglichkeit besteht darin, den Wert der letzten Gruppe in einer Variablen zu speichern.
%Vor% Hinweis: last()
ist eine Funktion data.table
, die das letzte Element eines Vektors (in diesem Fall der Spalte Product) zurückgibt.
Dies sollte auch schnell sein, da keine Logik aufgerufen wird, um den Wert der letzten Gruppe abzurufen; es hängt nur von den Gruppen ab, die in der Reihenfolge laufen (was sie tun).
Tags und Links r data.table