我有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.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)) )
} )
。
因此,对于我的小练习,我使用:
Aggregate
但是在我的较大名单上,这是一个非常长的问题,有人可以帮我找到更快的方法吗? sapply(split))
不是此处的选项,我一直未能使用ddply
替代{{1}}。建议即使不是实际代码对我也有帮助。
答案 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
,所以请小心这个答案:)