R语言自定义函数报错:动态生成列名计算均值失败
动态生成均值列的自定义函数修复方案
模拟数据
set.seed(2023) pid <- 1:30 y1 <- rnorm(30, 10, 10) y2 <- rnorm(30, 10, 10) x1 <- rnorm(30, 5, 2) x2 <- rnorm(30, 5, 2) x3 <- rnorm(30, 300, 3) data2 <- data.frame(pid, y1, y2, x1, x2, x3)
原函数问题分析
原函数存在三个关键错误:
- 管道符书写不完整:
%>应为标准的%>% - 动态列名赋值逻辑错误:直接用
paste0(...) = ...无法识别动态生成的列名,需使用:=结合!!解析字符串列名 - 函数名冲突:
try是R内置函数,自定义函数使用该名称会导致逻辑冲突
修复后的函数
add_manual_mean <- function(data, a, b) { # 获取参数对应的列名字符串 col_a <- rlang::as_name(rlang::enquo(a)) col_b <- rlang::as_name(rlang::enquo(b)) # 拼接生成新列名 new_col <- paste0(col_a, col_b, "_manual_mean") data <- data %>% mutate(!!new_col := ({{a}} + {{b}}) / 2) return(data) }
调用示例
t <- add_manual_mean(data2, y1, y2) # 查看生成的新列 head(t[, c("y1", "y2", "y1y2_manual_mean")])
简化写法(传入字符串列名)
如果更倾向于直接传入列名字符串,可使用.data代词简化逻辑:
add_manual_mean_str <- function(data, a, b) { new_col <- paste0(a, b, "_manual_mean") data %>% mutate(!!new_col := (.data[[a]] + .data[[b]]) / 2) } # 调用时传入字符串列名 t2 <- add_manual_mean_str(data2, "y1", "y2")
内容的提问来源于stack exchange,提问作者Tube
相关产品推荐
相关产品推荐

