2012-03-15 1 views
35

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

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. Каков наилучший способ сделать это?

Спасибо.

+0

Можете ли вы объяснить, что случилось с разбиваться (DF, DF $ г) '? Он возвращает список 'data.frame', по одному для каждого значения 'g'. –

ответ

70

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

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

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

Если вы хотите отдельный объект с именами группы г вы можете назначить элементы 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 
+0

Спасибо. Это было разделение каждого 'data.frame', созданного с помощью' split', на отдельные, отдельные объекты, с которыми я столкнулся. Это именно то, что я искал. – smillig

 Смежные вопросы

  • Нет связанных вопросов^_^