大ddply,适当的替代方案

use*_*296 2 r plyr lapply sapply

我有一个listdata.frames.每个data.frame都不是很大~15万行.但我的名单中有超过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)
Run Code Online (Sandbox Code Playgroud)

所以列表是:

complist <- list(comp,comp,comp)
Run Code Online (Sandbox Code Playgroud)

我想知道的每一个data.frame,( comp),长度B为每个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)) )
                                            } )
Run Code Online (Sandbox Code Playgroud)

但是在我较大的名单上,这是非常长的,有人可以帮我找到更快的方法吗?Aggregate不是这里的选择,而且我一直没能sapply(split))替代ddply.建议即使不是实际代码对我也有帮助.

Pau*_*tra 6

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

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


Aru*_*run 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")]
})
Run Code Online (Sandbox Code Playgroud)