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

如何在dplyr中当指定列值为NA时将多列替换为NA?

使用dplyr将rsum为NA行的临床变量替换为NA

现有包含临床变量(示例为a、b、c,取值为0/1)的表格X,其中rsum为求和列:

library(tibble)
X = tibble(a = c(0, 0, 0, 0), b = c(0, 1, 0, 1), c = c(0, 1, 0, 0), 
rsum = c(0, 2, NA, 1))
X

输出:

# A tibble: 4 × 4
      a     b     c  rsum
  <dbl> <dbl> <dbl> <dbl>
1     0     0     0     0
2     0     1     1     2
3     0     0     0    NA
4     0     1     0     1

需求:当rsum为NA时,将对应行的a、b、c替换为NA,得到结果表Y:

Y = tibble(a = c(0, 0, NA, 0), b = c(0, 1, NA, 1), c = c(0, 1, NA, 0), 
rsum = c(0, 2, NA, 1))
Y

输出:

# A tibble: 4 × 4
      a     b     c  rsum
  <dbl> <dbl> <dbl> <dbl>
1     0     0     0     0
2     0     1     1     2
3     NA    NA    NA    NA
4     0     1     0     1

尝试使用mutate+across时出现报错,错误代码:

mutate(X, across(a:c), ~if_else(is.na(rsum), NA, .)

报错信息:

Error in `mutate()`:
ℹ In argument: `~if_else(is.na(rsum), NA, .x)`.
Caused by error:
! `~if_else(is.na(rsum), NA, .x)` must be a vector, not a
  <formula> object.
Run `rlang::last_trace()` to see where the error occurred.

正确解决方案

错误原因:across语法使用错误,函数公式需作为across的第二个参数传入;同时if_else中需指定与原变量类型匹配的NA值(原变量为<dbl>类型,需用NA_real_)。

正确代码:

library(dplyr)
X %>%
  mutate(across(a:c, ~if_else(is.na(rsum), NA_real_, .x)))

运行后输出与目标表Y完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 07:53:34