【问题标题】:How to process "NA" as False in R如何在 R 中将“NA”处理为 False
【发布时间】:2026-02-09 15:05:01
【问题描述】:

我正在处理一个大型数据集,我正在尝试调用哪一行满足两列中的条件。但是,我想从分析中排除某些值,我认为将它们设置为“NA”是最好的。更复杂的是,如果其中一个列中有“NA”,我仍然想查看具有数值的另一列是否仍然满足条件。下面是我的数据集示例。

col1 = as.numeric(c(10, 2, 15, 2, "NA", 15))
col2 = as.numeric(c(15, 15, 2, 2, 15, "NA"))
test <- data.frame(col1, col2)

假设我的截止值是 5,所以我想要以下结果:

  col1 col2   G5
1   10   15  Yes
2    2   15   No
3   15    2   No
4    2    2   No
5   NA   15 Yes
6   15   NA Yes

我尝试了以下方法,但第 5 行和第 6 行返回为“NA”,我不知道如何解决这个问题。

test$G5 <- ifelse(test$col1 > 5 & test$col2 > 5, "Yes", "No")

  col1 col2   G5
1   10   15  Yes
2    2   15   No
3   15    2   No
4    2    2   No
5   NA   15 <NA>
6   15   NA <NA>

设置 ifelse 语句以便将“NA”视为“False”的最佳方法是什么?我认为问题在于,当 ifesle 考虑任一列并且使用“NA”执行逻辑测试时,它只能返回“NA”。

这是我第一次发布这个,所以我的格式可能很糟糕......对此感到抱歉!

谢谢

【问题讨论】:

  • test$G5 5) | is.na(test$col2) & (test$col1 > 5) | ! is.na(test$col1|test$col2) & (test$col2 > 5 & test$col2 > 5), "Yes", "No")
  • @ShirinYavari 我认为你处理了 NA 的倒退,他们最终应该是“不”。 OP,如果我有这个错误,请纠正我
  • @astrofunkswag 根据问题中显示的内容,这是正确的,但您的答案是倒退的。好不好?!
  • 哦,我看到了帖子的那一部分,这就是 OP 想要的,但这与将 NA 视为 false 不一致,它应该被忽略/视为 true

标签: r if-statement na


【解决方案1】:

对我来说,我认为最有益的方法是使用dplyrcase_when 函数并明确说明您提到的NA 案例应如何处理。

复制您的示例(请注意,我在这里明确设置了 NA。您的 NA 是 R 无法处理数字向量中的字符串(“NA”)的结果。

col1 = as.numeric(c(10, 2, 15, 2, NA_real_, 15))
col2 = as.numeric(c(15, 15, 2, 2, 15, NA_real_))
test <- data.frame(col1, col2)

对于mutate 函数和case_when 函数,我正在加载dplyr。如果您不熟悉case_when,它就像一个带有多个条件的 ifelse。每个条件后跟一个“~”波浪号。波浪号之后的内容是在满足条件时分配的内容。要将“其他所有内容”设置为某个值 X,请键入 TRUE ~ "x",因为对于之前条件中未满足的所有其他情况,这显然会被评估为 true。

这应该做你想做的:

library(dplyr)

test <- mutate(.data = test,
               G5 = case_when(col1 > 5 & col2 > 5 ~ "Yes", #Original 
                              (is.na(col1) & col2 > 5) | (col1 > 5 & is.na(col2)) ~ "Yes",
                              TRUE ~ "No")) # Everything else gets the value "No"


test
#>   col1 col2  G5
#> 1   10   15 Yes
#> 2    2   15  No
#> 3   15    2  No
#> 4    2    2  No
#> 5   NA   15 Yes
#> 6   15   NA Yes

【讨论】:

    【解决方案2】:

    test$G5 &lt;- ifelse((test$col1 &gt; 5 &amp; test$col2 &gt; 5) %in% TRUE, "Yes", "No")

    test$G5 <- ifelse(((test$col1 > 5) %in% TRUE | is.na(test$col1)) & ((test$col2 > 5) %in% TRUE | is.na(test$col2)), "Yes", "No")
    

    更多信息请见this post

    【讨论】:

      【解决方案3】:

      这是一种没有ifelse 或任何其他决策指令(switchcase_when)的方法。

      i <- with(test, (col1 > 5 & col2 > 5) | is.na(col1) | is.na(col2))
      test$G5 <- c("No", "Yes")[i + 1]
      
      test
      #  col1 col2  G5
      #1   10   15 Yes
      #2    2   15  No
      #3   15    2  No
      #4    2    2  No
      #5   NA   15 Yes
      #6   15   NA Yes
      

      【讨论】:

        【解决方案4】:

        这是另一个使用rowSums

        test$G5 <- c("No", "Yes")[(rowSums(is.na(test) | test > 5) == ncol(test)) + 1]
        test
        
        #  col1 col2  G5
        #1   10   15 Yes
        #2    2   15  No
        #3   15    2  No
        #4    2    2  No
        #5   NA   15 Yes
        #6   15   NA Yes
        

        另一种方法是将所有NA 替换为Inf,然后与5 进行比较。

        test[is.na(test)] <- Inf
        test$G5 <- c("No", "Yes")[(rowSums(test > 5) == ncol(test))+ 1]
        

        【讨论】:

          最近更新 更多