我想按一个因子变量的级别拆分现有的数据帧,以便拆分的数据帧的名称与因子的级别相对应。
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')
...有没有一种简单的方法可以一次完成这项工作?我有一个巨大的数据集,并且因子变量有太多的级别。
发布于 2013-07-17 17:09:53
您可以使用plyr包完成此操作
require(plyr)
dlply(df, .(Z))发布于 2013-07-17 17:05:16
在基数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)发布于 2013-07-17 17:04:03
sapply( levels( df$Z ), function( x ) list( subset( df, Z == x ) ) )这将返回一个列表,其中的元素以df$Z的级别命名,每个元素都包含df的子集。
Ops,提供了一个更好的答案,但已被删除--我将把解决方案放在这里:
split(df, df$Z)https://stackoverflow.com/questions/17695443
复制相似问题