使用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
相关产品推荐
相关产品推荐

