如何在group_by+mutate中提取分组变量并输出消息
用group_by实现分组输出消息的方法
你可以通过两种方式实现group_by结合消息输出的效果,以下是具体方案:
方法一:group_by + summarize(更简洁,贴合需求)
summarize本身就是针对每个分组执行一次计算,刚好符合每个组输出一次消息的需求,不需要额外控制执行次数:
library(dplyr) # 定义带消息输出的均值计算函数 calc_mean_with_msg <- function(mpg, cyl) { mean_val <- mean(mpg) message(paste0("气缸为", cyl, "的mpg均值是", mean_val)) mean_val } # 分组计算并输出消息 mtcars %>% group_by(cyl) %>% summarize( v = calc_mean_with_msg(mpg, unique(cyl)), .groups = "drop" # 取消分组状态,得到普通 tibble )
执行后会输出:
气缸为6的mpg均值是19.7428571428571 气缸为4的mpg均值是26.6636363636364 气缸为8的mpg均值是15.1 # A tibble: 3 × 2 cyl v <dbl> <dbl> 1 4 26.7 2 6 19.7 3 8 15.1
方法二:group_by + mutate(满足指定的组合要求)
如果必须用mutate,可以通过row_number()控制每个组只在第一行执行消息输出,最后去重得到每个组一行的结果:
library(dplyr) mtcars %>% group_by(cyl) %>% mutate( # 计算每个组的mpg均值 v = mean(mpg), # 仅在每个组的第一行输出消息 .before = 1 ) %>% rowwise() %>% mutate( dummy = if (row_number() == 1) { message(paste0("气缸为", cyl, "的mpg均值是", v)) NA } ) %>% ungroup() %>% # 保留唯一的分组和均值结果 distinct(cyl, v)
执行后同样会输出每个组的消息,最终结果和方法一一致。
关于group_keys的使用
如果你想通过group_keys来获取分组信息,可以先提取分组键,再结合purrr的函数处理,写法如下:
library(dplyr) library(purrr) group_info <- mtcars %>% group_by(cyl) %>% group_keys() group_info %>% mutate( v = map_dbl(cyl, function(c) { mean_val <- mtcars %>% filter(cyl == c) %>% pull(mpg) %>% mean() message(paste0("气缸为", c, "的mpg均值是", mean_val)) mean_val }) )
这种写法先提取分组键,再逐个处理每个分组,效果和之前的方法一致。
内容的提问来源于stack exchange,提问作者one
相关产品推荐
相关产品推荐

