【问题标题】:R - Pivot table with subtotalsR - 带有小计的数据透视表
【发布时间】:2018-05-31 19:55:37
【问题描述】:

如何在 R 中获取带有小计的数据透视表(如 MS Excel 数据透视表)?

我正在使用 reshape2 包中的 dcast 在 R 中创建枢轴。我还使用 rowSumscolSums 获得了总计。我承认我不了解dcast 参数集中的复杂性。我只知道如何创建数据透视表,帮助文件超出了我的想象。 如果有人可以使用dcast(我怀疑它可以解决所有问题)来解决这个问题,那将非常有帮助,并解释解决方案所需的参数。

我正在使用这段代码(C2 有两个因素,X1 和 X2):

PIV <- dcast(DF, C1~C2, value.var="C3", sum)

我没有得到所有这些边距、子集、填充或删除的作用。帮助文件似乎过于迟钝,我在互联网上也没有得到太多帮助。

Sample Pivot(无小计,T 为总计):

C1 X1 X2 T
a  12 1  13
a  14 2  16
b  16 3  19
b  11 4  15
b  8  5  13
T  61 15 76

样本预期枢轴(带有小计 t,T 是总计)

C1 X1 X2 T
a  12 1  13
a  14 2  16
ta 26 3  29
b  16 3  19
b  11 4  15
b  8  5  13
tb 35 12 47
T  61 15 76

【问题讨论】:

  • 试试library(data.table);rbind(setDT(df1), df1[, lapply(.SD, sum), C1][, C1:= paste0("t", C1)])

标签: r reshape2 dcast


【解决方案1】:

假设您开始时没有任何总计,如下所示:

mydf <- structure(list(C1 = c("a", "a", "b", "b", "b"), X1 = c(12L, 14L, 
    16L, 11L, 8L), X2 = 1:5), .Names = c("C1", "X1", "X2"), row.names = c(NA, 
    5L), class = "data.frame")

mydf
##   C1 X1 X2
## 1  a 12  1
## 2  a 14  2
## 3  b 16  3
## 4  b 11  4
## 5  b  8  5

那么您将不得不使用 margins 的参数 dcast 来获得您想要的输出。

library(reshape2)
mydfl <- melt(mydf)
mydfl$ind <- with(mydfl, ave(C1, C1, variable, FUN = seq_along))
dcast(mydfl, C1 + ind ~ variable, sum, 
      margins = c("C1", "ind", "variable"))
#      C1   ind X1 X2 (all)
# 1     a     1 12  1    13
# 2     a     2 14  2    16
# 3     a (all) 26  3    29
# 4     b     1 16  3    19
# 5     b     2 11  4    15
# 6     b     3  8  5    13
# 7     b (all) 35 12    47
# 8 (all) (all) 61 15    76

“边距”参数用于获取小计。在这里,我们根据“C1”(总计)和“ind”变量(小计)进行小计,并且我们还添加了行总计(使用“变量”)。

也就是说,我不确定我是否会推荐这个,因为您将数据和分析混合在同一个表中。

【讨论】:

  • 非常感谢。我想reshape2margins 可能会以同样的方式工作。我会试试的。基本上我正在尝试自动生成报告,这样我就不必每天都这样做。分析部分完成了,我被困在小计前面,因为这是一次向各个部门报告时的良好 MIS 做法(C1 是部门名称)。
  • @Arani,很酷。刚刚意识到“reshape2”确实有margins 参数,但它的工作方式有点不同。编辑了答案。我最近一直在使用dcast.data.table(还没有实现margins),以至于我错误地说它没有被带到“reshape2”中。
  • "grand_row" 和 "grand_col" 对我不起作用,即使它们在文档中!但是,我只需要将因子列添加到边距,它就像黄油一样工作。
  • @Arani,是的,我意识到了这一点并更新了我的答案。很高兴它成功了!
猜你喜欢
  • 1970-01-01
  • 2018-09-27
  • 2021-06-04
  • 1970-01-01
  • 2021-11-03
  • 2013-03-12
  • 2017-05-13
  • 2013-07-13
  • 2014-08-01
相关资源
最近更新 更多