Erstellen Sie einen "Index" für jedes Element einer Gruppe mit data.table

8

Meine Daten sind nach den IDs in V6 gruppiert und nach Position sortiert (V1: V3):

%Vor%

Was ich tun möchte, ist, eine zusätzliche Spalte mit einem Index nach Position hinzuzufügen, das heißt, pro Gruppe in V6 wäre das erste Element "1", das zweite "2" und so weiter. Ich kann das mit ddply und einer benutzerdefinierten Funktion erreichen:

%Vor%

Leider ist es im gesamten Dataset extrem langsam (~ 620k Zeilen) und bei Verwendung von parallel stürzt es ab und brennt:

%Vor%

Also, ich habe mich für data.table entschieden, aber es hat nicht funktioniert. Hier ist, was ich versucht habe:

%Vor%

Und beide sind gescheitert. Wie kann ich meine ddply mit data.table neu erstellen?

%Vor%     
fridaymeetssunday 09.02.2014, 11:22
quelle

2 Antworten

14

Als Bioinformatiker bin ich ziemlich oft auf diese Operation gestoßen. Und hier verehre ich data.table 's Teilmenge der Zeilen nach Referenz Funktion!

Ich würde es so machen:

%Vor%

Keine Funktionen erforderlich. Dies ist ein wenig vorteilhafter, da Sie nicht nach == "+" oder "-" einmal für jede Gruppe suchen müssen ! Stattdessen können Sie zuerst alle Gruppen mit + einmal unterteilen und dann nach V6 gruppieren und nur diese Zeilen ersetzen!

Ähnlich machen Sie es noch einmal für "-" . Hoffe das hilft.

  

Hinweis: .N ist eine spezielle Variable, die die Anzahl der Beobachtungen pro Gruppe enthält.

    
Arun 09.02.2014, 11:33
quelle
3

Zuerst lade ich Ihre Beispieldaten in R (Sie können derzeit dput() nicht mit data.table verwenden):

%Vor%

Sie können Ihr Problem mit dplyr fast elegant lösen:

%Vor%

(Ich habe angenommen, dass V2 die Variable ist, nach der Sie indexieren möchten - ich denke, es ist besser, explizit zu sein, anstatt sich auf die Reihenfolgezeile der Zeile zu verlassen)

Aber Sie wollen eine andere Zusammenfassung für verschiedene Teilmengen, was in dplyr nicht einfach ist. Ein Ansatz wäre, zu teilen und dann wieder zu kombinieren:

%Vor%

Aber das wird relativ langsam sein, da Sie zwei Kopien der Daten machen müssen.

Ein anderer Ansatz wäre die Verwendung eines if in der Zusammenfassung:

%Vor%     
hadley 09.02.2014 18:12
quelle

Tags und Links