2012-03-15 1 views
35

Sto provando a creare oggetti separati data.frame in base ai livelli di un fattore. Quindi, se ho:Dividi data.frame in base ai livelli di un fattore in nuovi data.frames

df <- data.frame(
    x=rnorm(25), 
    y=rnorm(25), 
    g=rep(factor(LETTERS[1:5]), 5) 
) 

come posso dividere df in separati data.frame s per ogni livello di g contenente corrispondenti x e y valori? Posso ottenere la maggior parte del modo lì usando split(df, df$g), ma mi piacerebbe che ogni livello del fattore avesse il proprio data.frame. Qual'è il miglior modo per farlo?

Grazie.

+0

si può spiegare ciò che è sbagliato con 'split (df, df $ g)'? Restituisce un elenco di 'data.frame's, uno per ogni valore di' g'. –

risposta

70

Penso che split fa esattamente quello che vuoi.

noti che X è una lista di frame di dati, come si è visto dal str:

X <- split(df, df$g) 
str(X) 

Se volete oggetto individuale con i nomi g di gruppo è possibile assegnare gli elementi di X da split ad oggetti di quei nomi , anche se questo sembra un lavoro extra quando puoi semplicemente indicizzare i frame di dati dall'elenco split crea.

#I used lapply just to drop the third column g which is no longer needed. 
Y <- lapply(seq_along(X), function(x) as.data.frame(X[[x]])[, 1:2]) 

#Assign the dataframes in the list Y to individual objects 
A <- Y[[1]] 
B <- Y[[2]] 
C <- Y[[3]] 
D <- Y[[4]] 
E <- Y[[5]] 

#Or use lapply with assign to assign each piece to an object all at once 
lapply(seq_along(Y), function(x) { 
    assign(c("A", "B", "C", "D", "E")[x], Y[[x]], envir=.GlobalEnv) 
    } 
) 

Modifica O ancora meglio che usare lapply da assegnare per l'ambiente globale usare list2env:

names(Y) <- c("A", "B", "C", "D", "E") 
list2env(Y, envir = .GlobalEnv) 
A 
+0

Grazie. Era la suddivisione di ogni 'data.frame' creato usando' split' in singoli oggetti separati con cui avevo difficoltà. Questo e 'esattamente quello che stavo cercando. – smillig