按因子级别拆分数据框,并按这些级别命名数据框

时间:2013-07-17 08:59:29

标签: r

我希望将现有数据帧除以其中一个因子变量的级别,以便拆分数据帧的名称对应于因子的级别。

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

如果df是原始数据框,我想将其拆分为三个名为ABC的数据框,以便:

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

有一种简单的方法可以一次性完成这项工作吗?我有一个庞大的数据集,因子变量的级别太多了。

3 个答案:

答案 0 :(得分:7)

在基础R中,您应该使用函数splitsplit有一个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)