我希望将现有数据帧除以其中一个因子变量的级别,以便拆分数据帧的名称对应于因子的级别。
df <- data.frame(cbind(X = 1:10, Y = rnorm(10)), Z = sample(LETTERS[1:3], 10, replace = TRUE))
如果df
是原始数据框,我想将其拆分为三个名为A
,B
和C
的数据框,以便:
A = subset(df, Z == 'A')
B = subset(df, Z == 'B')
...
有一种简单的方法可以一次性完成这项工作吗?我有一个庞大的数据集,因子变量的级别太多了。
答案 0 :(得分:7)
在基础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 :(得分:5)
您可以使用plyr
包
require(plyr)
dlply(df, .(Z))
答案 2 :(得分:3)
sapply( levels( df$Z ), function( x ) list( subset( df, Z == x ) ) )
这将返回一个列表,其中包含以df $ Z级别命名的元素,每个元素都包含df的子集。
Ops,提供了更好的答案,但已被删除 - 我将把解决方案放在这里:
split(df, df$Z)