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

使用purrr::map迭代列名时R dplyr自定义函数失效问题

问题解决:purrr::map迭代列名时函数报错“列不存在”

问题原因

你的函数test_fun使用了dplyr的整洁评估语法{{code}},这个语法用于直接捕获裸变量名(比如调用时写var1),但map迭代的over_vec是字符串向量(比如"var1"),整洁评估无法将字符串识别为列名,导致select步骤找不到对应列。

解决方案

方案1:修改函数兼容字符串输入

把函数里的{{code}}替换为.data[[code]](dplyr的.data代词,专门用于通过字符串引用列),修改后的函数如下:

test_fun <- function(code, dataset){
  dataset <- dataset %>% 
    group_by(.data[[code]]) %>% 
    summarise(n = n(), n_out = sum(outcome)) %>% 
    mutate(risk = n_out/n * 100, 
           rr = risk / risk[row_number() == 1]) %>%
    dplyr::select(.data[[code]], rr) %>%
    pivot_wider(names_from = .data[[code]], values_from = rr) %>%
    # 添加变量名标识,方便后续合并
    mutate(variable = code) %>%
    relocate(variable)
  return(dataset)
}

直接用原字符串向量迭代即可:

output <- over_vec %>% 
  map(.f = test_fun, dataset = test_dat)

方案2:迭代时传递符号而非字符串

用rlang::syms()把字符串向量转成符号列表,适配原函数的{{code}}语法:

# 转换字符串为符号列表
over_syms <- rlang::syms(over_vec)

# 迭代符号列表
output <- over_syms %>% 
  map(.f = test_fun, dataset = test_dat)

合并结果为统一表格

如果需要把所有列的相对风险合并成一个结构化表格,用bind_rows()即可:

output <- over_vec %>% 
  map(.f = test_fun, dataset = test_dat) %>%
  bind_rows()

最终会得到类似如下的结果:

variable   0   1
1     var1 1.0 0.5
2     var2 1.0  NaN
3     var3 1.0 0.7

内容的提问来源于stack exchange,提问作者r.bot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 01:20:08