如何结合purrr::map_dbl与dplyr管道、summarize计算数据框均值
用dplyr::summarize结合purrr::map_dbl计算列均值的问题解决
需求背景
想要通过%>%管道、dplyr的summarize函数,结合purrr的map_dbl函数,复现以下代码的计算结果(求mtcars数据集指定列的均值):
library(purrr) library(dplyr) vars <- c("mpg", "hp") vars <- set_names(vars) mean_f <- function(df, var) { mean(df[[var]]) } map_dbl(vars, ~mean_f(mtcars,.x))
遇到的问题
尝试了以下代码,但返回结果全是NA:
library(purrr) library(dplyr) vars <- c("mpg", "hp") vars <- set_names(vars) mean_f <- function(var) { mtcars %>% summarise(mean_val = mean({{ var }})) } map_dbl(vars, ~mean_f(.x)$mean_val)
问题原因
{{ var }}是dplyr的整洁评估语法,用于注入符号类型的列名,但这里传入的是字符串类型的列名,导致summarize无法匹配到对应的列,最终返回NA。
解决方案
方案1:使用.data代词(推荐)
利用dplyr的.data代词直接通过字符串引用列,语法更简洁直观:
library(purrr) library(dplyr) vars <- c("mpg", "hp") %>% set_names() mean_f <- function(var) { mtcars %>% summarise(mean_val = mean(.data[[var]], na.rm = TRUE)) %>% pull(mean_val) } map_dbl(vars, mean_f)
方案2:字符串转符号后注入
通过rlang::sym()将字符串转为符号,再用!!强制求值注入到summarize中:
library(purrr) library(dplyr) library(rlang) vars <- c("mpg", "hp") %>% set_names() mean_f <- function(var) { mtcars %>% summarise(mean_val = mean(!!sym(var), na.rm = TRUE)) %>% pull(mean_val) } map_dbl(vars, mean_f)
方案3:简化写法(无需单独定义函数)
直接在map_dbl中完成逻辑,省去单独的函数定义:
library(purrr) library(dplyr) vars <- c("mpg", "hp") %>% set_names() map_dbl(vars, ~mtcars %>% summarise(mean = mean(.data[[.x]], na.rm = TRUE)) %>% pull(mean))
以上三种方案都能得到和目标代码一致的结果:
mpg hp 20.09062 146.6875
内容的提问来源于stack exchange,提问作者menomale
相关产品推荐
相关产品推荐

