Próbuję utworzyć osobne obiekty data.frame na podstawie poziomów współczynnika. Więc jeśli mam:
df <- data.frame(
x=rnorm(25),
y=rnorm(25),
g=rep(factor(LETTERS[1:5]), 5)
)
jak mogę podzielić df na osobne data.frames dla każdego poziomu g
zawierającego odpowiednie wartości x i y? Mogę uzyskać to używając split(df, df$g), ale chciałabym, aby każdy poziom współczynnika miał swoją własną ramkę data.frame
. Jak najlepiej to zrobić? Z góry dzięki za pomoc!
Dzięki.
1 odpowiedź
split
dokładnie to, co chcesz.
Zauważ, że X to lista ramek danych, widziana przez str
:
X <- split(df, df$g)
str(X)
Jeśli chcesz pojedynczego obiektu z nazwami grupy g
, możesz przypisać elementy X z podziału do obiektów o tych nazwach, choć może się to wydawać dodatkową pracą, gdy możesz po prostu zindeksować ramki danych z utworzonego podziału listy.
# Użyłem lapply do upuszczenia trzeciej kolumny g, która nie jest już potrzebna.
Y <- lapply(seq_along(X), function(x) as.data.frame(X[[x]])[, 1:2])
# Przypisz ramki danych na liście Y do poszczególnych obiektów
A <- Y[[1]]
B <- Y[[2]]
C <- Y[[3]]
D <- Y[[4]]
E <- Y[[5]]
#Lub użyj lapply z przypisaniem, aby przypisać każdy element do obiektu jednocześnie
lapply(seq_along(Y), function(x) {
assign(c("A", "B", "C", "D", "E")[x], Y[[x]], envir=.GlobalEnv)
}
)
Lub nawet lepiej niż przy użyciu lapply do przypisania do środowiska globalnego użyj list2env:
names(Y) <- c("A", "B", "C", "D", "E")
list2env(Y, envir = .GlobalEnv)
A