Aggregating sub totals and grand totals with data.table

前端 未结 5 2488
一向
一向 2020-12-14 03:41

I\'ve got a data.table in R:

library(data.table)
set.seed(1)
DT = data.table(
  group=sample(letters[1:2],100,replace=TRUE), 
  year=sample(2010         


        
5条回答
  •  一整个雨季
    2020-12-14 04:34

    I'm not aware of a simple way. Here's a first stab at an implementation. I don't know margins=TRUE in plyr, is this what that does?

    crossby = function(DT, j, by) {
        j = substitute(j)
        ans = rbind(
            DT[,eval(j),by],
            DT[,list("Total",eval(j)),by=by[1]],
            cbind("Total",DT[,eval(j),by=by[2]]),
            list("Total","Total",DT[,eval(j)]),
            use.names=FALSE
            # 'use.names' argument added in data.table v1.8.0
        )
        setkeyv(ans,by)
        ans
    }
    
    crossby(DT, mean(v), 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
    

提交回复
热议问题