代码之家  ›  专栏  ›  技术社区  ›  Peter Ellis

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

r
  •  5
  • Peter Ellis  · 技术社区  · 8 年前

    所以,我对这个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的每个元素找到了匹配项:因此这些值是真是假,而不是na。

    有没有类似于 % % 除了在这种情况下会给一个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 回复  |  直到 8 年前
        1
  •  6
  •   akrun    8 年前

    我们可以用 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