如何使用 dplyr 对同一数据集的多个子集和组重复操作?
How to repeat an operation for several subsets and groups of the same dataset with dplyr?
我想知道是否有一种方法可以使用函数式编程对数据的不同子集重复某些操作?
下面是我如何“手动”执行的示例,但我的问题是:有没有办法将相同的公式应用于同一数据集的不同子集?
这是一个示例数据集:
dt <- data.frame(group = rep(LETTERS[1:3], each = 12*3),
year = rep(2018:2020, each = 12),
month = rep(1:12, times = 3),
value = rnorm(12*3*3, 2, .3))
这就是我现在正在做的事情。有三种分组方式(每组、每组和每年、每组和每年的子集月份)。然后,执行相同的操作(用平均值、最小值、最大值汇总)。
下面的代码完成了我想要的,但我想知道是否有更有效的方法来做到这一点,最好是使用 dplyr。
bind_rows(
# First grouping
dt %>% group_by(group) %>%
# Common summary
summarise(mean = mean(value),
min = min(value),
max = max(value)) %>%
mutate(grouping = "per group"),
# Second grouping
dt %>% group_by(group, year) %>%
# Common summary
summarise(mean = mean(value),
min = min(value),
max = max(value)) %>%
mutate(grouping = "per group and per year"),
# Third grouping
dt %>% filter (month %in% 6:8) %>% group_by(group, year) %>%
# Common summary
summarise(mean = mean(value),
min = min(value),
max = max(value)) %>%
mutate(grouping = "per group, summer months")
)
有什么想法吗?
library(purrr)
library(dplyr)
groupings <- list(
. %>% group_by(group),
. %>% group_by(group, year),
. %>% filter (month %in% 6:8) %>% group_by(group, year)
)
grouping_labels <- list(
"per group",
"per group and per year",
"per group, summer months"
)
common_summary <- . %>%
summarise(mean = mean(value),
min = min(value),
max = max(value))
map2(
groupings,
grouping_labels,
~ dt %>% .x() %>% common_summary() %>% mutate(grouping = .y)
) %>%
bind_rows()
我想知道是否有一种方法可以使用函数式编程对数据的不同子集重复某些操作?
下面是我如何“手动”执行的示例,但我的问题是:有没有办法将相同的公式应用于同一数据集的不同子集?
这是一个示例数据集:
dt <- data.frame(group = rep(LETTERS[1:3], each = 12*3),
year = rep(2018:2020, each = 12),
month = rep(1:12, times = 3),
value = rnorm(12*3*3, 2, .3))
这就是我现在正在做的事情。有三种分组方式(每组、每组和每年、每组和每年的子集月份)。然后,执行相同的操作(用平均值、最小值、最大值汇总)。 下面的代码完成了我想要的,但我想知道是否有更有效的方法来做到这一点,最好是使用 dplyr。
bind_rows(
# First grouping
dt %>% group_by(group) %>%
# Common summary
summarise(mean = mean(value),
min = min(value),
max = max(value)) %>%
mutate(grouping = "per group"),
# Second grouping
dt %>% group_by(group, year) %>%
# Common summary
summarise(mean = mean(value),
min = min(value),
max = max(value)) %>%
mutate(grouping = "per group and per year"),
# Third grouping
dt %>% filter (month %in% 6:8) %>% group_by(group, year) %>%
# Common summary
summarise(mean = mean(value),
min = min(value),
max = max(value)) %>%
mutate(grouping = "per group, summer months")
)
有什么想法吗?
library(purrr)
library(dplyr)
groupings <- list(
. %>% group_by(group),
. %>% group_by(group, year),
. %>% filter (month %in% 6:8) %>% group_by(group, year)
)
grouping_labels <- list(
"per group",
"per group and per year",
"per group, summer months"
)
common_summary <- . %>%
summarise(mean = mean(value),
min = min(value),
max = max(value))
map2(
groupings,
grouping_labels,
~ dt %>% .x() %>% common_summary() %>% mutate(grouping = .y)
) %>%
bind_rows()