首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用replace_with_na函数用NA替换范围外的值

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

Stack Overflow用户
提问于 2020-06-02 10:19:40
回答 4查看 881关注 0票数 3

我有以下数据集

代码语言:javascript
复制
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

在b列中,我只想要4-9之间的值。在50-80之间的第c栏。将范围以外的值替换为NA,从而导致

代码语言:javascript
复制
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函数中,我尝试了几种最符合逻辑的方法:

代码语言:javascript
复制
test <- replace_with_na_at(data = test, .vars="c",
                          condition = ~.x < 2 & ~.x > 2)

不过,我什么也没试过。有人知道为什么吗?谢谢!)

EN

回答 4

Stack Overflow用户

发布于 2020-06-02 10:36:17

您可以使用逻辑向量来测试您的条件。

代码语言:javascript
复制
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

数据:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2020-06-02 10:41:02

还有另一个基本R解决方案,这次是使用函数is.na<-

代码语言:javascript
复制
is.na(test$b) <- with(test, b < 4 | b > 9)
is.na(test$c) <- with(test, c < 50 | c > 80)

带有管道的包naniar解决方案可以是

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2020-06-02 10:30:47

您只需使用Map将您的值替换为NA

代码语言:javascript
复制
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

数据:

代码语言:javascript
复制
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))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62149789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档