2017-09-01 4 views
0

Ich habe einen großen Datenrahmen (knapp über 8.500.000 Zellen insgesamt) und ich muss einige Teilmengen dieses Datenrahmens basierend auf den Werten in einer bestimmten Spalte erstellen.Ist es möglich, Teilmengen eines Datenrahmens für jeden Wert in einer Spalte eines Master-Datenrahmens zu erstellen?

Ich bin mir bewusst, dass ich die Subsets von Hand erstellen kann und bin froh, dies zu tun, wenn es nur ein paar Werte gibt. Derzeit erhalte ich die eindeutigen Werte:

table(df$ColumnX) 

und bauen dann die einzelnen Datenrahmen von dort, da es nur wenige Werte:

df.subset1 <- df[df$ColumnX == "Subset1", ] 
df.subset2 <- df[df$ColumnX == "Subset2", ] 
... 
df.subsetX <- df[df$ColumnX == "SubsetX", ] 

Aber wenn es deutlich mehr eindeutige Werte sind, wo ich sehe ein Problem, das die Verarbeitungsleistung meines Computers erfordern würde, um mein Ziel rechtzeitig zu erreichen.

Was ich wissen möchte, ist, wenn dieser Prozess automatisiert werden kann.

So etwas ist, was ich zu erreichen bin der Hoffnung:

- List values in Column X 
- Create a new dataframe/subset for each value in Column X 

Oder:

for(all unique values in Column X) 
    create a new dataframe 
end for 

Deshalb würde ich so etwas wie dieses haben basierend auf den Werten von ColumnX:

df.subset1 
df.subset2 
... 
df.subsetX 
+0

Verwenden Sie einfach 'split' heißt' dflist <- split (df df $ ColumnX) '. Dies wird Ihnen eine Liste von data.frames geben –

+0

Ich sehe. Und wie extrahiere ich die data.frames aus der Liste? – MusTheDataGuy

+0

Wenn Sie das Beispiel 'x <- split (iris, iris $ Species)' verwenden, können Sie die Listenelemente entweder mit 'x $ setosa' oder' x [[1]] 'oder' x [["setosa "]]' –

Antwort

1

Beispieldatensatz:

zz <- "A1 A2 A3 A4 A5 
Z Z 1 10 12 
E Y 10 12 8 
D X 2 12 15 
Z Z 1 10 12 
D X 2 14 16" 
df <- read.table(text=zz, header = TRUE) 

s1 <- split(df, df$A1) 
list2env(s1,envir=.GlobalEnv) 

Die Liste erhält als Datenrahmen in Ihrer Umgebung gespeichert

> D 
    A1 A2 A3 A4 A5 
3 D X 2 12 15 
5 D X 2 14 16 
> E 
    A1 A2 A3 A4 A5 
2 E Y 10 12 8 
> Z 
    A1 A2 A3 A4 A5 
1 Z Z 1 10 12 
4 Z Z 1 10 12 
0

ich mit einigen @docendo, dass in der Regel in einer Liste die Datenrahmen zu halten in der Regel effizienter zu gestalten.

Aber für Rekord willen, können Sie auch assign verwenden:

list_index <- list(1:5, 6:8, 10:13) 

for(i in 1:length(list_index)){ # i <- 1 
    assign(paste0("df_", i), mtcars[list_index[i][[1]], ]) 
} 
Verwandte Themen