我想在数据框中用“NA”替换值,但前提是指定列中的值超出定义的范围。
这是一个例子: 假设我的数据框中有 5 列(称为 a、b、c、d、e)。我想检查列“a”是否超出特定范围(例如 a < 2 or a > 5),如果是这样,我想将“NA”分配给列 a、b 和 中的值c 但列 d 和 e 中的值应保持不变。
a <- c(1, 3, 6, 1, 4)
b <- c(4, 5, 7, 5, 3)
c <- c(1, 2, 3, 5, 2)
d <- c(3, 3, 3, 5, 6)
e <- c(2, 2, 4, 2, 1)
data <- data.frame(cbind(a,b,c,d,e))
所以期望的输出是:
a b c d e
NA NA NA 3 2
3 5 2 3 2
NA NA NA 3 4
NA NA NA 5 2
4 3 2 6 1
这是我尝试过的:
variables <- c("a", "b", "c")
new_data <- data %>%
mutate(across(variables), if_else(a < 2 | a > 5, NA_character_, ""))
另一个想法是将其放入 for 循环中:
for (x in variables) {
new_data <- data %>%
mutate(across(all_of(variables)), if_else(a < 2 | a > 5, NA_character_, x))
}
但是这些解决方案仅添加一列,并没有相应地更改值。
这是一个简化的示例。我想将该解决方案应用于更多数量的变量。如有任何帮助,我们将不胜感激!
你已经快到了,但你需要注意如何提供你的功能。您可以像这样使用 tidyverse 公式界面(请注意,
.x
将指您当前正在变异的列):
library(dplyr)
data %>%
mutate(across(c(a, b, c), ~ if_else(!between(a, 2, 5), NA_real_, .x)))
# a b c d e
# 1 NA NA NA 3 2
# 2 3 5 2 3 2
# 3 NA NA NA 3 4
# 4 NA NA NA 5 2
# 5 4 3 2 6 1
检查a列,然后将a、b、c列设置为NA:
data[ data$a < 2 | data$a > 5, c("a", "b", "c") ] <- NA
data
# a b c d e
# 1 NA NA NA 3 2
# 2 3 5 2 3 2
# 3 NA NA NA 3 4
# 4 NA NA NA 5 2
# 5 4 3 2 6 1