R中%的优雅版本返回NA?

时间:2018-06-08 05:52:48

标签: r

所以,我对这个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的帮助文件的仔细检查表明这是记录在案的行为,返回:

  

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

是否存在类似于%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)

但有没有一种常见的方法呢?

1 个答案:

答案 0 :(得分:6)

我们可以将NA替换为使用NA生成的is.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