2012-03-15 13 views
35

Próbuję utworzyć oddzielne obiekty data.frame oparte na poziomach czynnika. Więc jeśli mam:Podział danych.frame na podstawie poziomów współczynnika na nowe dane.frames

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

jak mogę podzielić df na odrębne data.frame s dla każdego poziomu g zawierającego odpowiednie x i y wartości? Mogę uzyskać większość z tego sposobu za pomocą split(df, df$g), ale chciałbym, aby każdy poziom czynnika miał swój własny data.frame. Jaki jest najlepszy sposób na zrobienie tego?

Dzięki.

+0

może Pan wyjaśnić, co jest nie tak z 'split (DF, df $ g)'? Zwraca listę 'data.frame's, jedną dla każdej wartości' g'. –

Odpowiedz

70

Myślę, że split robi dokładnie to, co chcesz.

Zauważ, że X jest lista ramek danych, jak widać przez str:

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

Jeśli chcesz pojedynczy obiekt z nazwami grupa G można przypisać elementy x od split do obiektów o tych nazwach , chociaż wydaje się, że jest to dodatkowa praca, gdy można po prostu indeksować ramki danych z listy, które tworzy split.

#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) 
    } 
) 

Edit Albo nawet lepiej niż przy użyciu lapply przypisać do globalnego środowiska używać list2env:

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

Dzięki. Był to podział każdego 'data.frame' utworzonego przy użyciu' split' na pojedyncze, oddzielne obiekty, z którymi miałem problemy. Właśnie tego szukałem. – smillig

Powiązane problemy