首页 > 解决方案 > R 中返回 NA 的 %in% 的优雅版本?

问题描述

因此,我对这段 R 代码第三行的行为​​感到惊讶:

x <- c(1, 2, 3, 4, NA, 5, 6, 7, 8)
ifelse(x < 4, 1, 0)
ifelse(x %in% 1:3, 1, 0)

它返回1,1,1,0,0,0,0,0,0的不是1,1,1,0,NA,0,0,0,0我认为我会得到的,即与第二行相同。仔细检查帮助文件%in%match显示这是记录在案的行为,返回:

“一个逻辑向量,指示是否为 x 的每个元素找到匹配项:因此值是 TRUE 或 FALSE,从不 NA。”

%in%除了在这种情况下会给出 NA 之外,是否有一个类似于的通用函数?例如,这将返回所需的结果:

`%inna%` <- function(x, table){
  y <- match(x, table, nomatch = 0) > 0
  y[is.na(x)] <- NA
  return(y)
}

ifelse(x %inna% 1:3, 1, 0)

但是有没有一种通用的方法来做到这一点?

标签: r

解决方案


我们可以通过使用生成NA的乘法来替换NAis.na(x)

(x %in% 1:3) * NA^(is.na(x))
#[1]  1  1  1  0 NA  0  0  0  0

或使用replace

replace(+(x %in% 1:3), is.na(x), NA)
#[1]  1  1  1  0 NA  0  0  0  0

可以转换成函数

`%inna%` <- function(x, table) {
      replace(as.integer(x %in% table), is.na(x), NA)
 }

x %inna% 1:3
#[1]  1  1  1  0 NA  0  0  0  0

推荐阅读