data.table aktualisiert das letzte Element in der Gruppe basierend auf der Bedingung

7

Ich habe eine data.table mit 3 Spalten: ID, Zeit und Status. Für jede ID möchte ich den Datensatz mit der maximalen Zeit finden - dann, wenn für diesen Datensatz der Status wahr ist, möchte ich ihn auf false setzen, wenn die Zeit & gt; 7 (zum Beispiel). Ich mache es auf die folgende Art.

%Vor%

Ich habe viele Daten, mit denen ich arbeite, und möchte diesen Vorgang beschleunigen. Irgendwelche Vorschläge würden geschätzt werden!

    
user2506086 03.03.2016, 00:29
quelle

4 Antworten

8
%Vor%

Wenn ich mich nicht irre, ist dies kein Join, da x[,.N, by=id][,cumsum(N)] die Zeilenindizes der letzten Elemente pro Gruppe zurückgibt.

Aktualisierung: Nachdem man den Geschwindigkeitsvergleich gesehen hat, scheint dieser der Sieger zu sein und sollte zuerst aufgeführt werden

Dies war mein erster Versuch, der sich als der langsamste aller vorgeschlagenen Lösungen herausgestellt hat.

%Vor%     
Rentrop 03.03.2016 00:49
quelle
7

Ein data.table Ansatz ist

%Vor%

als x[order(time), .I[.N], by=id]$V1 gibt uns den Zeilenindex der maximalen time für jede Gruppe ( id )

Und wenn wir uns die Antwort von @ Floo0 ausleihen, können wir es leicht zu

vereinfachen %Vor%

Geschwindigkeitsvergleich

Ein Geschwindigkeitstest der verschiedenen Antworten (und die Schlüssel auf den Daten halten)

%Vor%     
SymbolixAU 03.03.2016 00:37
quelle
5

Noch ein Versuch:

%Vor%     
thelatemail 03.03.2016 02:11
quelle
3

Hier ist ein anderer Weg, ähnlich den OP's:

%Vor%

Hier ist ein weiterer Maßstab:

%Vor%

Ergebnis:

%Vor%     
Frank 03.03.2016 05:56
quelle

Tags und Links