Ruft die letzte Zeile einer vorherigen Gruppe in data.table ab

7

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

%Vor%

ohne Erfolg.

    
gibbz00 09.07.2016, 19:52
quelle

2 Antworten

14

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. ;)

%Vor%

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%     
Rich Scriven 09.07.2016, 20:10
quelle
7

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).

    
Matt Dowle 23.02.2017 22:41
quelle

Tags und Links