【问题标题】:Subsetting a vector with a condition (excluding NA)使用条件对向量进行子集(不包括 NA)
【发布时间】:2018-04-18 02:30:02
【问题描述】:
vector1 = c(1,2,3,NA)
condition1 = (vector1 == 2)
vector1[condition1]
vector1[condition1==TRUE]

以上代码中,condition1为“FALSE TRUE FALSE NA”, 第 3 行和第 4 行都给了我结果“2 NA” 这不是我所期望的。

我想要值真正为“2”的元素,不包括 NA。

谁能解释为什么 R 被设计成以这种方式工作? 以及如何通过简单的命令获得我想要的结果?

【问题讨论】:

    标签: r logical-operators na


    【解决方案1】:

    子集vector[NA] 将始终为NA,因为NA 的值是未知的,因此子集的结果也是未知的。 %in%NA 返回FALSE,所以它在这里很有用。

    vector1 = c(1,2,3,NA)
    condition1 = (vector1 %in% 2)
    vector1[condition1]
    # [1] 2
    

    【讨论】:

      【解决方案2】:

      如果你在 RStudio 中并进入

      ?`[`
      

      你会得到以下解释:

      索引中的 NA

      提取时,数字、逻辑或字符 NA 索引会选择一个 未知元素,因此在 a 的相应元素中返回 NA 逻辑、整数、数字、复数或字符结果,对于 a 列表。 (对于原始结果,它返回 00。)

      替换时(即在赋值的 lhs 上使用索引)不适用 不选择任何要替换的元素。因为有歧义 rhs的一个元素是否应该使用,这只是 如果 rhs 值的长度为 1,则允许(因此两种解释 会有同样的结果)。 (记录在案的 S 行为是 一个 NA 替换索引“无处可去”,但用完了一个元素 价值:Becker 等人 p。 359. 然而,其他情况并非如此 实现。)

      【讨论】:

        【解决方案3】:

        在这种情况下尝试逻辑运算符,

        vector1 = c(1,2,3,NA)
        condition1<-(vector1==2 & !is.na(vector1) )
        condition1
        # FALSE TRUE FALSE FALSE
        vector1[condition1]
        # 2
        

        当两个逻辑运算符都为真时,&运算返回真。

        【讨论】:

        • 详情请见?NA
        【解决方案4】:

        identical 是“测试两个对象是否完全相等的安全可靠的方法。在这种情况下返回 TRUE,在其他情况下返回 FALSE。” (见?相同)

        由于它不比较元素比较,您可以在 sapply 中使用它来比较 vector1 和 2 中的每个元素。即:

        condition1 = sapply(vector1, identical, y = 2)
        

        这将给出:

        vector1[condition1]
        [1] 2
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-06
          • 1970-01-01
          • 2015-01-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多