我想在数据框中用“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))
}
型
但这些解决方案只添加一列,而不会相应地更改值。
这是一个简化的例子。我想将解决方案应用到更多的变量。任何帮助是感激!
2条答案
按热度按时间isr3a4wc1#
你几乎已经完成了,但是你需要注意你如何提供你的函数。你可以像这样使用tidyverse公式接口(注意
.x
将引用你当前正在改变的列):字符串
s3fp2yjn2#
检查a列,然后将a、B、c列设置为NA:
字符串