惯用的 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
我同时使用 dplyr
和 data.table
,所以我很想知道是否有使用任一软件包的解决方案。
我通常想通过一些分组变量和整个数据集(总均值)来使用汇总统计数据来总结数据——为了举例,我们说均值。然后我通常将它们组合成一个单独的输出数据帧进行显示,在分组变量列中将总平均行指定为“总计”或“总体”。
这是我通常使用 dplyr
和 data.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
我同时使用 dplyr
和 data.table
,所以我很想知道是否有使用任一软件包的解决方案。
我通常想通过一些分组变量和整个数据集(总均值)来使用汇总统计数据来总结数据——为了举例,我们说均值。然后我通常将它们组合成一个单独的输出数据帧进行显示,在分组变量列中将总平均行指定为“总计”或“总体”。
这是我通常使用 dplyr
和 data.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