R: Auswahl der Teilmenge ohne zu kopieren

9

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:

  • copy-on-write -Mechanismus, d. h. Datenstrukturen, die nur kopiert werden, wenn Sie vorhandene Elemente hinzufügen oder neu schreiben;
  • unveränderbare Datenstrukturen , die nur die Indexierungsinformationen für die Datenstruktur neu erstellen müssen, aber nicht deren Inhalt (wie zum Beispiel die Erzeugung einer Teilzeichenkette aus der Zeichenkette, indem nur ein kleines Objekt mit Länge und einem Zeiger auf dieselbe Zeichenkette erzeugt wird) ;
  • xapply() Analoga, die keine Teilmengen erstellen.
ffriend 05.03.2012, 19:55
quelle

1 Antwort

5

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.

    
Matt Dowle 06.03.2012, 13:05
quelle