Ich schreibe einige R-Skripte neu, die große Datenmengen analysieren (~ 17 Millionen Zeilen), und ich dachte, ich würde versuchen, die Speichereffizienz zu verbessern, indem ich das Paket data.table
nutze (was ich gerade erst lerne!).Komplizierte Zusammenfassung Funktion - ist es möglich, mit R data.table Paket zu lösen?
Ein Teil des Codes hat mich ein wenig verwirrt. Ich kann meine ursprüngliche Lösung nicht veröffentlichen, weil (1) es Mist (langsam!) Ist und (2) es in Bezug auf die Daten sehr nuanciert ist und diese Frage nur komplizierter macht.
Stattdessen habe ich dieses Spielzeug Beispiel gemacht (und es ist wirklich ein Spielzeug Beispiel):
ds <- data.table(ID=c(1,1,1,1,2,2,2,3,3,3),
Obs=c(1.5,2.5,0.0,1.25,1.45,1.5,2.5,0.0,1.25,1.45),
Pos=c(1,3,5,6,2,3,5,2,3,4))
die wie folgt aussieht:
ID Obs Pos
1: 1 1.50 1
2: 1 2.50 3
3: 1 0.00 5
4: 1 1.25 6
5: 2 1.45 2
6: 2 1.50 3
7: 2 2.50 5
8: 3 0.00 2
9: 3 1.25 3
10: 3 1.45 4
Zur Erleichterung der Erklärung, ich werde so tun, dass wir Züge beobachten (jeder Zug hat seine eigene ID), bewegt sich über eine lineare Einbahnstraße, mit Beobachtungen (etwas Wert, nicht von Import zu der Frage) über den Zug, der an festgelegten Positionen gemacht wird (pos, hier von 1-6) entlang der Strecke. Es ist nicht zu erwarten, dass ein Zug die gesamte Länge der Strecke zurücklegt (vielleicht explodierte er, bevor er Position 6 erreichte), und manchmal vergisst der Beobachter eine Beobachtung ... Die Positionen sind aufeinander folgend (wenn wir also die Beobachtung verpasst haben) der Zug an Position 4, aber wir haben ihn an Position 5 beobachtet, wir wissen, dass er Position 4) passiert haben muss.
Aus der obigen data.table muß ich so eine Tabelle generieren:
Pos Count
1: 1 3
2: 2 3
3: 3 3
4: 4 3
5: 5 2
6: 6 1
Wo für jeden eindeutigen Po in meiner data.table ds ich eine Zählung der Anzahl der Züge das schaffte es zu dieser Position auf der Spur (oder weiter), unabhängig davon, ob die Beobachtung an dieser Position auf der Spur gemacht wurde.
Wenn jemand irgendwelche Ideen oder Vorschläge hat, wie man das anpackt, würde es sehr geschätzt werden. Leider kenne ich die data.table nicht genug, um zu wissen, ob dies möglich ist! Oder es könnte unglaublich einfach zu lösen sein Problem und ich bin nur langsam :)
+1 wirklich schöne Lösung und noch bessere Erklärung. Könnten Sie etwas darüber sagen, wie Sie dies mit 'ds [, list (Pos = 1: Pos [.N]), mit = ID] [, .N, by = Pos] vergleichen würden, wenn die Daten größer werden? –
@ SimonO'Hanlon Schöne Alternative. 'Pos [.N]' wäre ein neuer Vektor der Länge 1, der an die Funktion ':' übergeben wird, um einen neuen '1: Pos [.N]' Vektor zu erzeugen. Ich würde erwarten, dass all diese kleinen Vektoren Speicher blockieren und mehr Müll sammeln. Als die Anzahl der Züge zunahm, würde das mehr beißen (mehr Gruppen), als die Anzahl der Positionen vielleicht stieg. Wenn Sie es testen, interessiert mich das Ergebnis! –
Ich verstehe die Data.table-Syntax nicht wirklich, aber das CJ sieht teuer aus (konzeptionell, wenn nicht wirklich?); Gibt es eine Lösung wie meine, in der data.table die maximale Pos nach ID identifiziert, d. h. uns schnell zu 'nAtMax' bringt? Vielleicht macht das @ SimonO'Hanlon? –