大ddply,适当的替代方案

时间:2013-01-28 13:59:38

标签: r plyr lapply sapply

我有list data.frames。每个data.frame不是很大~150,000行。但是我的列表中有超过1000个data.frames

data.frame看起来像:

comp <- read.table(text = " G T H S B
                             1 1 1 1 x1
                             1 1 1 2 x2
                             1 2 6 1 x3
                             1 2 6 2 x4
                             2 1 7 1 x1
                             2 2 8 2 x2
                             2 2 8 1 x1
                             2 3 9 2 x2",header=TRUE,stringsAsFactors=FALSE)

所以列表是:

complist <- list(comp,comp,comp)

我想了解每个data.framecompB的长度S,每个H中每个T G每个library(plyr) listresults <- lapply(complist, function(x) { res <- ddply(x, .(G,T,H,S), function(z) data.frame(resultcol = length(z$B)) ) } )

因此,对于我的小练习,我使用:

Aggregate

但是在我的较大名单上,这是一个非常长的问题,有人可以帮我找到更快的方法吗? sapply(split))不是此处的选项,我一直未能使用ddply替代{{1}}。建议即使不是实际代码对我也有帮助。

3 个答案:

答案 0 :(得分:6)

这种情况data.table可能是一个非常好的选择。 data.table一直表现得非常快,更为明显plyr。这里有很多关于SO的例子,参见例如:

这只是可用信息的一小部分,您可以查看data.table的文档,或查看SO上的[r][data.table]标记。

答案 1 :(得分:6)

使用data.table可以加快速度。这是你如何做到的。

require(data.table)
o <- lapply(1:length(complist), function(i) { 
    dt <- data.table(complist[[i]], key=c("S", "H", "T", "G"))
    dt[, list(resultcol = .N), by=c("S", "H", "T", "G")]
})

答案 2 :(得分:2)

尝试使用data.table

lapply(complist, function(df) {
  df <- data.table(df, key=c("G","T","H","S"))
  df[,length(B),by=c("G","T","H","S")]
})

免责声明:这是我第一次使用data.table,所以请小心这个答案:)