R 跨定义的变量进行变异,并根据另一列更改值

问题描述 投票:0回答:2

我想在数据框中用“NA”替换值,但前提是指定列中的值超出定义的范围。

这是一个例子: 假设我的数据框中有 5 列(称为 a、b、c、d、e)。我想检查列“a”是否超出特定范围(例如 a < 2 or a > 5),如果是这样,我想将“NA”分配给列 a、b 中的值c 但列 de 中的值应保持不变。

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))
}

但是这些解决方案仅添加一列,并没有相应地更改值。

这是一个简化的示例。我想将该解决方案应用于更多数量的变量。如有任何帮助,我们将不胜感激!

r conditional-operator mutate
2个回答
0
投票

你已经快到了,但你需要注意如何提供你的功能。您可以像这样使用 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

0
投票

检查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
© www.soinside.com 2019 - 2024. All rights reserved.