如何在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
相关产品推荐
相关产品推荐

