【问题标题】:big ddply, appropriate alternative大ddply,合适的替代品
【发布时间】:2013-01-11 21:19:05
【问题描述】:

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

我想知道每个data.frame、(comp)、每个S 中每个H 中每个T 中每个G 中的B 的长度。

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

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 为所有人。开始data.table 方法实际上已经完成了,虽然这需要一些学习。

标签: r plyr lapply sapply


【解决方案1】:

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

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

【讨论】:

  • 谢谢你的链接,看来我得学习一下data.table了!
  • 'data.table' 包非常适合这样总结。请记住,您通常甚至可以通过重新格式化数据以特别适合您的问题来击败“data.table”的性能。
【解决方案2】:

使用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")]
})

【讨论】:

  • +1 不知道.N 的长度快捷方式。这只是一个nrow?
  • @Arun 仅供参考,密钥的顺序是否有原因(SHTG 而不是 GTHS)?
【解决方案3】:

尝试使用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,所以要小心这个答案:)

【讨论】:

    猜你喜欢
    • 2018-02-09
    • 2010-09-06
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 2020-05-26
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多