2016-04-26 15 views
7

Ich habe eine große Liste von data.frames, die paarweise nach Spalten und dann nach Zeilen verknüpft werden müssen, bevor sie in ein Vorhersagemodell eingegeben werden. Da keine Werte verändert werden, würde ich gerne den finalen data.frame auf die originalen data.frames in meiner Liste haben.Binden von Daten.frames zeilenweise in R ohne Erstellen von Kopien

Zum Beispiel:

library(pryr) 

#individual dataframes 
df1 <- data.frame(a=1:1e6+0, b=1:1e6+1) 
df2 <- data.frame(a=1:1e6+2, b=1:1e6+3) 
df3 <- data.frame(a=1:1e6+4, b=1:1e6+5) 

#each occupy 16MB 
object_size(df1) # 16 MB 
object_size(df2) # 16 MB 
object_size(df3) # 16 MB 
object_size(df1, df2, df3) # 48 MB 

#will be in a named list 
dfs <- list(df1=df1, df2=df2, df3=df3) 

#putting into list doesn't create a copy 
object_size(df1, df2, df3, dfs) #48MB 

Finale data.frame diese Orientierung haben wird (jedes einzigartiges Paar data.frames durch Spalten gebunden, dann durch Reihen gebunden Paare):

df1, df2 
df1, df3 
df2, df3 

Ich bin dies derzeit als solches implementiert:

Wie kann ich vermeiden, meine Daten zu kopieren, aber immer noch das gleiche Ziel zu erreichen Ergebnis?

+5

Glaubst du nicht, dass du kannst. In den ersten Manipulationen haben Sie gerade R-Objekte von einer Liste in eine andere "verschoben" (eine Spalte eines data.frames ist ein R-Objekt für sich). Der letzte Schritt beinhaltete die Erstellung neuer Objekte (die Spalten von 'combo_df'), die übrigens * die Daten zweier bestehender Objekte enthielten. Eine Kopie ist notwendig. Ein Vektor in R speichert seine Daten * zusammenhängend *; Sie können keinen Vektor erstellen, in dem ein Teil der Daten auf eine Region und ein anderer Teil auf eine andere Region zeigt. – nicola

Antwort

0

Das Speichern der Werte, wie Sie hoffen, würde erfordern, dass R eine Komprimierung des Datenrahmens ausführt. Ich glaube nicht, dass Datenrahmen Kompression unterstützen.

Wenn Ihre Motivation, die Daten auf diese Weise speichern zu wollen, schwierig ist, sie in den Speicher einzupassen, können Sie die ff package ausprobieren. Dies würde es Ihnen ermöglichen, es kompakter auf der Festplatte zu speichern. Die ffdf-Klasse scheint die von Ihnen benötigten Eigenschaften zu haben:

Standardmäßig erstellt das Erstellen eines 'ffdf' -Objekts KEINE neuen ff-Dateien, stattdessen werden vorhandene Dateien referenziert. Dies unterscheidet sich von data.frame, das immer Kopien der Eingabeobjekte erstellt, vor allem in data.frame (matrix()), wo eine Eingabematrix in einzelne Spalten konvertiert wird. ffdf dagegen speichert eine Eingabematrix physikalisch als dieselbe Matrix und bildet sie virtuell auf Spalten ab.

Zusätzlich ist das ff-Paket für den schnellen Zugriff optimiert.

Beachten Sie, dass ich dieses Paket nicht selbst verwendet habe, so kann ich nicht garantieren, dass es Ihr Problem lösen wird.