更快的替代doBy / summaryBy

时间:2012-01-21 14:06:56

标签: r dataframe

我目前使用summaryBy包中的doBy命令按特定函数对数据帧的行进行分组。这很好用。但是:

doBy包加载速度非常慢,我认为因为它导入了各种其他包。加载doBy需要大约3秒钟。我只需要此软件包中的简单summaryBy功能。

是否有可能加快软件包的加载时间,或者是否有其他实现方法无法加载这么大的软件包?

3 个答案:

答案 0 :(得分:15)

为了聚合具有复杂功能的大型数据集,很难超越data.table包。例如,以下是您为虹膜数据集汇总meansd Sepal.Length的方法:

require(data.table)
dat <- data.table(iris)
dat[,list(mean=mean(Sepal.Length), sd=sd(Sepal.Length)),by=Species]

库加载速度很快,只需要1行代码(如果算上将data.frame转换为data.table,则需要2行),而且速度非常快。你还想要什么?

答案 1 :(得分:6)

只需将base-R lapply(split(.))范例与您想要的功能一起使用,就可以获得更快的性能。

 dat <- structure(list(category = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("A", 
"B", "C"), class = "factor"), year = c(2000, 2001, 2004, 2005, 
2009, 2010, 2000, 2001, 2004, 2005, 2009, 2010, 2000, 2001, 2004, 
2005, 2009, 2010), incidents = c(7, 4, 4, 2, 3, 1, 6, 3, 5, 2, 
2, 5, 2, 1, 4, 4, 2, 1)), .Names = c("category", "year", "incidents"
), row.names = c(NA, -18L), class = "data.frame")

split(dat, dat$category)
lapply( split(dat[-1], dat$category), summary)

答案 2 :(得分:3)

1)请尝试从doBy源包中获取summaryBy.RorderBy.R,而不是安装doBy包:

setwd("doBy/R")
source("summaryBy.R")
source("orderBy.R")

summaryBy(...whatever...)

2)删除包中除DESCRIPTION文件,R目录和那两个源文件(删除所有其他.R文件)之外的所有文件,从DESCRIPTION文件中删除Depends:和Imports:行(可选择更改包:在描述中划分一些其他名称),然后重新构建并安装新的精简包。 (另一种可能性是将所有文件保留在包中,只删除STRpe文件中的Depends:和Imports:行,但加载速度不如删除几乎所有文件的速度快。)