4

我想通过因子变量之一的级别拆分现有数据框,以便拆分数据框的名称对应于因子的级别。

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

如果df是原始数据框,我想将其拆分为三个数据框,称为A,BC,这样:

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

有没有一种简单的方法可以一次性做到这一点?我有一个庞大的数据集,并且因子变量的级别太多。

4

3 回答 3

7

在基础 R 中,您应该使用函数split. 并且split有一个default方法和一个 for 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)
于 2013-07-17T09:05:16.343 回答
5

你可以用plyr包来做

require(plyr)
dlply(df, .(Z))
于 2013-07-17T09:09:53.167 回答
3
sapply( levels( df$Z ), function( x ) list( subset( df, Z == x ) ) )

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

操作,提供了更好的答案,但已被删除 - 我将解决方案放在这里:

split(df, df$Z)
于 2013-07-17T09:04:02.967 回答