如何使用mutate across处理多列,将NA值替换为对应列名?
解决方法
要实现将airquality指定列中的NA值替换为列名、非NA值保留原内容的需求,正确的dplyr写法如下:
library(dplyr) # 处理Ozone和Solar.R两列,也可以用列索引1:2 airquality_processed <- airquality %>% mutate(across(c(Ozone, Solar.R), ~if_else(is.na(.), cur_column(), as.character(.)))) # 查看结果 head(airquality_processed)
运行后会得到你期望的输出:
Ozone Solar.R Wind Temp Month Day 1 41 190 7.4 67 5 1 2 36 118 8.0 72 5 2 3 12 149 12.6 74 5 3 4 18 313 11.5 62 5 4 5 Ozone Solar.R 14.3 56 5 5 6 28 Solar.R 14.9 66 5 6
错误原因分析
第一个代码的问题
你最初的写法:
airquality %>% mutate(across(1:2, paste0(cur_column())))
错误在于paste0(cur_column())不是传递给across的函数,cur_column()必须在across内部的函数(比如~定义的匿名函数)中调用,否则它无法识别当前处理的列,因此触发Must only be used inside across()错误。
第二个自定义函数的问题
你的自定义函数存在两个核心问题:
- 逻辑颠倒:你写的
!is.na({{column_name}}) ~ paste0("{column_name}")是把非NA值替换成列名字符串,和需求完全相反; - 语法错误:
paste0("{column_name}")不会解析变量,要获取列名需要用cur_column()或者rlang::as_name(enquo(column_name)),而且函数内部直接用mutate不符合across的使用逻辑。
内容的提问来源于stack exchange,提问作者lilblue
相关产品推荐
相关产品推荐

