use*_*296 2 r plyr lapply sapply
我有一个list的data.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.建议即使不是实际代码对我也有帮助.
这种情况data.table可能是一个非常好的选择.data.table一直表现得非常快,更是如此plyr.这里有很多关于SO的例子,例如:
这只是可用信息的一小部分,您可以查看文档data.table,或查看[r][data.table]SO 上的标记.
使用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)
| 归档时间: |
|
| 查看次数: |
1294 次 |
| 最近记录: |