惯用的 dplyr and/or data.table 一步获得组均值和总均值 "idiomatically" 的方法

Idiomatic dplyr and/or data.table way to get group means and grand means "idiomatically" in a single step

我同时使用 dplyrdata.table,所以我很想知道是否有使用任一软件包的解决方案。

我通常想通过一些分组变量和整个数据集(总均值)来使用汇总统计数据来总结数据——为了举例,我们说均值。然后我通常将它们组合成一个单独的输出数据帧进行显示,在分组变量列中将总平均行指定为“总计”或“总体”。

这是我通常使用 dplyrdata.table 的方式:

dplyr

library(dplyr)

d <- tibble(grp = rep(letters[1:3], 10), v = 1:30)

group_means <- d %>%
  group_by(grp) %>%
  summarize(v_mean = mean(v))
grand_means <- d %>%
  summarize(v_mean = mean(v)) %>%
  mutate(grp = 'overall')

bind_rows(group_means, grand_means)

data.table

library(data.table)

d <- data.table(grp = rep(letters[1:3], 10), v = 1:30)

group_means <- d[, .(v_mean = mean(v)), by = .(grp)]
grand_means <- d[, .(v_mean = mean(v))]
grand_means[, grp := 'overall']

rbindlist(list(group_means, grand_means), use.names = TRUE)

我的问题是这不是很简洁。在这个例子中并没有那么糟糕,但是如果我必须计算大量的汇总统计数据,我必须重复相同的代码两次。我的问题是,在 dplyr 或 data.table 中是否有一种惯用且简洁的方法来获取分组和总体汇总统计信息?

这里有一个使用 dplyr 的简洁方法:

d %>%
  add_row(grp = 'overall', v = mean(.$v)) %>%
  group_by(grp) %>%
  summarise(mean_v = mean(v))

另一种选择,以避免重复两次汇总统计计算:

d %>%
  bind_rows(mutate(., grp = 'overall')) %>%
  group_by(grp) %>%
  summarise(mean_v = mean(v))

我删除了之前的答案,因为我发现这个简洁的 data.table 函数

data.table::cube(d, mean(v), by = c("grp"))

这会为您提供组的(子)总计

    grp   V1
1:    a 14.5
2:    b 15.5
3:    c 16.5
4: <NA> 15.5

包括替换NA和正确的列名

data.table::cube(d, .(v_mean = mean(v)), by = c("grp"))[is.na(grp), grp := "overall"][]

       grp v_mean
1:       a   14.5
2:       b   15.5
3:       c   16.5
4: overall   15.5

可在此处找到更多信息: https://www.rdocumentation.org/packages/data.table/versions/1.14.2/topics/groupingsets