2013-07-17 37 views
2

我想根据其中一个因子变量的级别拆分现有数据框,以便拆分数据框的名称将与该因子的级别相对应。按因子和名称数据框的级别拆分数据帧

df <- data.frame(cbind(X = 1:10, Y = rnorm(10)), Z = sample(LETTERS[1:3], 10, replace = TRUE)) 

如果df是原始数据框,我想把它分成三个dataframes称为ABC,使得:

A = subset(df, Z == 'A') 
B = subset(df, Z == 'B') 
... 

有一个简单的办法一次性做到这一点?我有一个巨大的数据集和因子变量有太多的水平。

回答

4

您可以用plyr

require(plyr) 
dlply(df, .(Z)) 
2
sapply(levels(df$Z), function(x) list(subset(df, Z == x))) 

这将返回一个列表,其中包含以df $ Z的级别命名的元素,每个元素包含df的子集。

行动,一个更好的答案被提供,但已被删除 - 我会在这里把解决方案:

split(df, df$Z) 
5

在基础R,你应该使用功能split。并且split具有default方法和data.frame。但是,我发现split.data.frame是非常缓慢的,因为分裂的层数变得很大。也就是,

# inefficient in my opinion 
split(df, df$Z) 

上述解决方案会给你你直接要求的名字,但会在很大程度上窒息。

而且,如果你愿意使用速度/效率,外部包交易,我建议使用data.table包:

require(data.table) 
dt <- data.table(df) 
oo <- dt[, list(list(.SD)), by = Z]$V1 
names(oo) <- unique(dt$Z) 
+1

护理做为第二个解决方案提供一些解释?第3行和第4行(但大部分是3)对于R新手(我)来说看起来像是黑魔法。 –