You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 15:25:11