R语言mutate函数传递变量填充DataFrame NA值时语法报错
问题解决:动态列名在mutate中赋值的语法错误
错误原因分析
- 动态列名赋值语法错误:在dplyr的
mutate中,使用动态变量作为列名时,不能直接用=,必须用:=来区分动态列名与常规参数,你的代码中!!name =不符合语法要求,导致报错。 - ifelse函数括号不完整:
is.na(!!name后缺少闭合括号,导致函数参数格式错误。
修正后的循环代码
df <- data.frame("Colonne1" = c(1, 2, NA, 4, 5, NA), "Colonne2" = c(6, NA, 8, 9, NA, 11), "Colonne3" = c(NA, 13, 14, NA, 16, 17), "Colonne4" = runif(6)) means_ <- colMeans(df, na.rm = TRUE)[-c(ncol(df))] for(name in names(means_)){ df <- df %>% mutate(!!name := ifelse(is.na(!!name), Colonne4 * means_[name], !!name)) }
更高效的非循环方案(推荐)
无需循环,直接用dplyr的across函数批量处理目标列,代码更简洁且性能更优:
df <- df %>% mutate(across(all_of(names(means_)), ~ ifelse(is.na(.), Colonne4 * means_[cur_column(.)], .)))
all_of(names(means_))指定需要处理的目标列cur_column()获取当前处理的列名,匹配means_中对应的均值- 用
.指代当前处理的列,替代循环中的动态变量
内容的提问来源于stack exchange,提问作者dia05
相关产品推荐
相关产品推荐

