R:输出带有小计的类似数据透视表

s_a*_*s_a 5 html pivot-table r xtable r-markdown

我正在尝试在R中进行交叉制表,并使其输出尽可能类似于我在Excel数据透视表中获得的输出。目的是将用Excel和Word手动生成的报告替换为用R Markdown自动生成的报告。数据处理和图表已得到解决,但缺少一些表格。因此,给出以下代码:

set.seed(2)
df<-data.frame("ministry"=paste("ministry ",sample(1:3,20,replace=T)),"department"=paste("department ",sample(1:3,20,replace=T)),"program"=paste("program ",sample(letters[1:20],20,replace=F)),"budget"=runif(20)*1e6)
library(tables)
library(dplyr)
arrange(df,ministry,department,program)
tabular(ministry*department~((Count=budget)+(Avg=(mean*budget))+(Total=(sum*budget))),data=df)
Run Code Online (Sandbox Code Playgroud)

产生(实际数据要复杂得多):

                                 Avg    Total  
 ministry    department    Count budget budget 
 ministry  1 department  1 5     479871 2399356
             department  2 1     770028  770028
             department  3 1     184673  184673
 ministry  2 department  1 2     170818  341637
             department  2 1     183373  183373
             department  3 3     415480 1246440
 ministry  3 department  1 0        NaN       0
             department  2 5     680102 3400509
             department  3 2     165118  330235
Run Code Online (Sandbox Code Playgroud)

这与我可以得到的Excel结果差不多。我需要显示小计,如下所示(在Excel中使用完全相同的数据生成):

Excel数据透视表结果与小计

是否有可能在R中获得类似的信息(无需逐个单元格手动编码表)?

谢谢!

G. *_*eck 3

将左侧替换为:

ministry * (department + 1) + 1
Run Code Online (Sandbox Code Playgroud)

也就是说,试试这个:

tabular(ministry * (department + 1) + 1 ~
           ((Count = budget) + (Avg = (mean * budget)) + (Total = (sum * budget))), 
        data = df)
Run Code Online (Sandbox Code Playgroud)

给予:

                                 Avg    Total  
 ministry    department    Count budget budget 
 ministry  1 department  1  5    479871 2399356
             department  2  1    770028  770028
             department  3  1    184673  184673
             All            7    479151 3354057
 ministry  2 department  1  2    170818  341637
             department  2  1    183373  183373
             department  3  3    415480 1246440
             All            6    295242 1771449
 ministry  3 department  1  0       NaN       0
             department  2  5    680102 3400509
             department  3  2    165118  330235
             All            7    532963 3730744
             All           20    442813 8856250
Run Code Online (Sandbox Code Playgroud)

更新:更正。

  • 如果 `tab` 是上面显示的结果,则 `tab[,2] &lt;- lapply(tab[,2], function(x) if (is.nan(x)) 0 else x)` 将替换 `NaN`与“0”。 (2认同)