Разделить data.frame, основанный на уровнях фактора, на новые data.frames - PullRequest
40 голосов
/ 15 марта 2012

Я пытаюсь создать отдельные data.frame объекты на основе уровней фактора. Так что если у меня есть:

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

как я могу разделить df на отдельные data.frame с для каждого уровня g, содержащие соответствующие значения x и y? Я могу пройти большую часть пути, используя split(df, df$g), но я бы хотел, чтобы каждый уровень фактора имел свой data.frame. Какой лучший способ сделать это?

Спасибо.

1 Ответ

79 голосов
/ 15 марта 2012

Я думаю, что split делает именно то, что вы хотите.

Обратите внимание, что X - это список фреймов данных, как видно из str:

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

Если вы хотитеДля отдельного объекта с именами группы g вы можете назначить элементы X из split объектам с такими именами, хотя это кажется дополнительной работой, когда вы можете просто проиндексировать кадры данных из списка, который создает 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)
    }
)

Редактировать Или даже лучше, чем использовать lapply для назначения глобальной среде, используйте list2env:

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