Gibt es eine Möglichkeit, eine Teilmenge aus Objekten (Datenrahmen, Matrizen, Vektoren) auszuwählen, ohne eine Kopie ausgewählter Daten zu erstellen?
Ich arbeite mit ziemlich großen Datensätzen, ändere sie aber nie. Aus praktischen Gründen wähle ich jedoch häufig Teilmengen der Daten aus, auf denen gearbeitet werden soll. Das Erstellen einer Kopie einer großen Teilmenge jedes Mal ist sehr speicherineffizient, aber sowohl die normale Indizierung als auch subset
(und damit xapply()
-Familie von Funktionen) erstellt Kopien ausgewählter Daten. Ich suche nach Funktionen oder Datenstrukturen, die dieses Problem lösen können.
Einige mögliche Ansätze, die meinen Bedürfnissen entsprechen und hoffentlich in einigen R-Paketen implementiert sind:
xapply()
Analoga, die keine Teilmengen erstellen. Probieren Sie ref aus. Insbesondere seine refdata
-Klasse.
Was Sie vielleicht an data.table
vermissen, ist, dass beim Gruppieren ( by=
-Parameter) die Teilmengen der Daten nicht kopiert werden, also ist das schnell. [Nun, technisch gesehen sind sie nur in einem gemeinsamen Speicherbereich, der für jede Gruppe wiederverwendet wird, und kopiert mit memcpy, das viel schneller ist als Rs für Schleifen in C.]
:=
in data.table
ist eine Möglichkeit, eine data.table
an Ort und Stelle zu ändern. data.table
weicht vom üblichen R-Programmierstil ab, da es nicht kopiert-auf-geschrieben ist. Der Benutzer muss copy()
explizit aufrufen, um eine (möglicherweise sehr große) Tabelle selbst innerhalb einer Funktion zu kopieren.
Sie haben Recht, dass in refdata
kein Mechanismus wie data.table
eingebaut ist. Ich sehe was du meinst und es wäre ein nettes Feature. refdata
sollte jedoch auf einem data.table
funktionieren, und Sie könnten mit data.frame
zufrieden sein (aber achten Sie darauf, Kopien mit tracemem(DF)
zu überwachen).
Es gibt auch idata.frame
(unveränderlich data.frame
) im Paket plyr
, das Sie ausprobieren könnten.
Tags und Links r immutability apply subset copy-on-write