使用data.table聚合子总计和总计

前端之家收集整理的这篇文章主要介绍了使用data.table聚合子总计和总计前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在R中有一个data.table:
library(data.table)
set.seed(1)
DT = data.table(
  group=sample(letters[1:2],100,replace=TRUE),year=sample(2010:2012,v=runif(100))

按照小组和年份将此数据汇总到汇总表中简单而优雅:

table <- DT[,mean(v),by='group,year']

然而,将这些数据聚合到一个汇总表中,包括小计和总计,这是一个困难的一点,而且不那么优雅:

library(plyr)
yearTot <- DT[,list(mean(v),year='Total'),by='group']
groupTot <- DT[,group='Total'),by='year']
Tot <- DT[,year='Total',group='Total')]
table <- rbind.fill(table,yearTot,groupTot,Tot)
table$group[table$group==1] <- 'Total'
table$year[table$year==1] <- 'Total'

这产生:

table[order(table$group,table$year),]

有没有一个简单的方法来指定小计和总计与data.table,如对于plyr的marginins = TRUE命令?我更喜欢在我的数据集上使用data.table over plyr,因为它是一个非常大的数据集,我已经在data.table格式.

我不知道一个简单的方法.这是实施的第一个刺.我不知道plyr中的margin = TRUE,这是什么?
crossby = function(DT,j,by) {
    j = substitute(j)
    ans = rbind(
        DT[,eval(j),by],DT[,list("Total",eval(j)),by=by[1]],cbind("Total",by=by[2]]),"Total",eval(j)]),use.names=FALSE
        # 'use.names' argument added in data.table v1.8.0
    )
    setkeyv(ans,by)
    ans
}

crossby(DT,c("group","year"))

      group  year        V1
 [1,]     a  2010 0.2926945
 [2,]     a  2011 0.4176346
 [3,]     a  2012 0.4227796
 [4,]     a Total 0.3901875
 [5,]     b  2010 0.5231845
 [6,]     b  2011 0.4997119
 [7,]     b  2012 0.4306871
 [8,]     b Total 0.4835788
 [9,] Total  2010 0.4278093
[10,] Total  2011 0.4463616
[11,] Total  2012 0.4271160
[12,] Total Total 0.4350153

猜你在找的设计模式相关文章