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

i1icjdpr  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(115)

我想在数据框中用“NA”替换值,但仅当指定列中的值超出定义的范围时。
下面是一个例子:假设我在一个数据框中有5列(称为a,B,c,d,e)。我想检查列“a”是否超出了某个范围(例如 a < 2 or a >5),如果是真的,我想将“NA”分配给列 a,Bc 中的值,但列 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))
}


但这些解决方案只添加一列,而不会相应地更改值。
这是一个简化的例子。我想将解决方案应用到更多的变量。任何帮助是感激!

isr3a4wc

isr3a4wc1#

你几乎已经完成了,但是你需要注意你如何提供你的函数。你可以像这样使用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

字符串

s3fp2yjn

s3fp2yjn2#

检查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

字符串

相关问题