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

如何使用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()错误。

第二个自定义函数的问题

你的自定义函数存在两个核心问题:

  1. 逻辑颠倒:你写的!is.na({{column_name}}) ~ paste0("{column_name}")是把非NA值替换成列名字符串,和需求完全相反;
  2. 语法错误:paste0("{column_name}")不会解析变量,要获取列名需要用cur_column()或者rlang::as_name(enquo(column_name)),而且函数内部直接用mutate不符合across的使用逻辑。

内容的提问来源于stack exchange,提问作者lilblue

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 13:17:32