使用replace_with_na函数将范围外的值替换为NA

4

我有以下数据集

structure(list(a = c(2, 1, 9, 2, 9, 8), b = c(4, 5, 1, 9, 12, 
NA), c = c(50, 34, 77, 88, 33, 60)), class = "data.frame", row.names = c(NA, 
-6L))

  a  b  c
1 2  4 50
2 1  5 34
3 9  1 77
4 2  9 88
5 9 12 33
6 8 NA 60

我只想要第二列中4-9之间的数值,第三列中50-80之间的数值。将范围外的值替换为NA,得到:

structure(list(a = c(2, 1, 9, 2, 9, 8), b = c(4, 5, NA, 9, NA, 
NA), c = c(50, NA, 77, NA, NA, 60)), class = "data.frame", row.names = c(NA, 
-6L))

  a  b  c
1 2  4 50
2 1  5 NA
3 9 NA 77
4 2  9 NA
5 9 NA NA
6 8 NA 60

我已经尝试了 replace_with_na_at 函数的几种用法,其中这个看起来最合理:

test <- replace_with_na_at(data = test, .vars="c",
                          condition = ~.x < 2 & ~.x > 2)

然而,我尝试的一切都没有起作用。有人知道为什么吗?提前感谢! :)

3
replace_with_na_at() 函数来自哪个包?你应该在可重复的示例代码中包含相关的库调用。 - s_baldur
5个回答

4

这是另一个基于R语言的解决方案,使用 is.na<- 函数。

is.na(test$b) <- with(test, b < 4 | b > 9)
is.na(test$c) <- with(test, c < 50 | c > 80)

一个使用管道的naniar解决方案可能是:
library(naniar)
library(magrittr)

test %>%
  replace_with_na_at(
    .vars = 'b',
    condition = ~(.x < 4 | .x > 9)
  ) %>%
  replace_with_na_at(
    .vars = 'c',
    condition = ~(.x < 50 | .x > 80)
  )

3
你可以使用Map将你的值替换为NA
dat[2:3] <- Map(function(x, y) {x[!x %in% y] <- NA;x}, dat[2:3], list(4:9, 50:80))
dat
#   a  b  c
# 1 2  4 50
# 2 1  5 NA
# 3 9 NA 77
# 4 2  9 NA
# 5 9 NA NA
# 6 8 NA 60

数据:

dat <- structure(list(a = c(2, 1, 9, 2, 9, 8), b = c(4, 5, 1, 9, 12, 
NA), c = c(50, 34, 77, 88, 33, 60)), class = "data.frame", row.names = c(NA, 
-6L))

3
你可以使用逻辑向量测试你的条件进行子集筛选。
x$b[x$b < 4 | x$b > 9] <- NA
x$c[x$c < 50 | x$c > 80] <- NA
x
#  a  b  c
#1 2  4 50
#2 1  5 NA
#3 9 NA 77
#4 2  9 NA
#5 9 NA NA
#6 8 NA 60

数据:

x <- structure(list(a = c(2, 1, 9, 2, 9, 8), b = c(4, 5, 1, 9, 12, 
NA), c = c(50, 34, 77, 88, 33, 60)), class = "data.frame", row.names = c(NA, 
-6L))

3
我们可以使用map2
library(purrr)
library(dplyr)
df1[c('b', 'c')] <- map2(df1 %>% 
       select(b, c), list(c(4, 9), c(50,80)), ~ 
           replace(.x, .x < .y[1]|.x > .y[2], NA))

2

您应该提及您正在使用的软件包。从谷歌搜索来看,我猜测您正在使用 naniar。问题似乎是您没有正确指定条件,但以下内容应该可以解决:

library(naniar)

test <- structure(list(a = c(2, 1, 9, 2, 9, 8), 
                    b = c(4, 5, 1, 9, 12, NA),
                    c = c(50, 34, 77, 88, 33, 60)), 
               class = "data.frame", 
               row.names = c(NA, -6L)) 

replace_with_na_at(test, "c", ~.x < 50 | .x > 80)
#>   a  b  c
#> 1 2  4 50
#> 2 1  5 NA
#> 3 9  1 77
#> 4 2  9 NA
#> 5 9 12 NA
#> 6 8 NA 60

2020年6月2日,使用reprex软件包(版本0.3.0)创建


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接