Jak podzielić data.frame na podstawie poziomów czynnika na nowe data.frame?

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

Twoja odpowiedź

Zaloguj się aby odpowiedzieć.

Operiada

Operiada to polskojęzyczne forum informatyczne działające na zasadzie pytań i odpowiedzi.

Obserwowane tagi

Zaloguj się aby obserwować tagi.