比R中的aggregate()更快的功能

时间:2017-03-09 10:08:30

标签: r aggregate

我的代码有以下部分:

 result <- aggregate(cbind(x1,x2,x3,y1,y2,y3,z1,z2,z3,w)~date, rbind(result, datanew), sum, na.rm=F) 

是否有更快的方法来获得相同的结果? 我想做的是每当我有一个新数据时,新数据与旧数据进行比较,并同时为每列和每行进行求和。

例如:

old.data=data.frame(x=c(1:3),y=c(4:6),z=c(7:9),id=c("A","B","B"))
new.data=data.frame(x=c(2:4),y=c(5:7),z=c(8:10),id=c("B","A","A"))
result <- aggregate(cbind(x,y,z)~id, rbind(old.data, new.data), sum, na.rm=F)

我正在寻找更好的解决方案,因为这会重复100000次。

由于

1 个答案:

答案 0 :(得分:1)

我确信真实的数据要大得多,但你的解决方案似乎是正确的。作为一些替代方案,我对其他方法进行了基准测试:

Tidyverse

tidy_fn <- function(){
    rbind(old.data, new.data) %>% group_by(id) %>% dplyr::summarise_all(
        function(x)sum(x)
    )
}

Plyr和基本功能(我知道......形式)

plyr_base_fn <- function(){

  plyr::ldply(Map(function(x){
    sapply(x[1:3],sum)
    }, rbind(old.data,new.data) %>% split(., .$id)
    ))

}

您的汇总方法:

agg_fn <- function(){
    aggregate(cbind(x,y,z)~id, rbind(old.data, new.data), sum, na.rm=F)
}

两项测试的结果:

1000次
> microbenchmark(tidy_fn(),agg_fn(),plyr_base_fn(),times = 1000L)
Unit: milliseconds
           expr      min       lq     mean   median       uq       max neval
      tidy_fn() 2.220585 2.386112 2.823122 2.529649 2.775300 13.425573  1000
       agg_fn() 1.668601 1.795527 2.149068 1.895666 2.062904 16.117802  1000
 plyr_base_fn() 1.253772 1.331501 1.567777 1.402464 1.526089  8.396307  1000
5000代表
microbenchmark(tidy_fn(),agg_fn(),plyr_base_fn(),times = 5000L)
    Unit: milliseconds
               expr      min       lq     mean   median       uq       max neval
          tidy_fn() 2.227752 2.400265 2.696034 2.542617 2.722082  12.46249  5000
           agg_fn() 1.673647 1.792085 2.067232 1.897011 2.019915 301.84694  5000
     plyr_base_fn() 1.247306 1.336010 1.503682 1.411608 1.503290  14.24656  5000