2

我有一个listdata.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)

我想知道 for each data.frame, ( ), for each in each in each的comp长度。BSHTG

所以对于我的小练习,我使用:

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. 即使不是实际代码的建议也会对我有帮助。

4

3 回答 3

6

这种情况data.table可能是一个很好的选择。data.table一直显示出极快的速度,更是如此plyr。这里有很多关于 SO 的示例,请参见:

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

于 2013-01-28T14:04:44.593 回答
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")]
})
于 2013-01-28T14:12:46.817 回答
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,所以要小心这个答案:)

于 2013-01-28T14:12:57.827 回答