使用data.table聚合子总计和总计
发布时间:2020-05-23 05:56:51 所属栏目:程序设计 来源:互联网
导读:我在R中有一个data.table: library(data.table)set.seed(1)DT = data.table( group=sample(letters[1:2],100,replace=TRUE), year=sample(2010:2012,100,replace=TRUE), v=runif(100)) 按照小组和年份将此数据汇总到汇总表中简单而优雅:
|
我在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 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
