如何在R中将"NA"处理为False

3

我正在处理一份大型数据集,并尝试确定哪些行同时满足两个列的条件。但是,我希望排除分析中的某些值,并且我认为将它们设置为“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 <- ifelse(is.na(test$col1) & (test$col2 > 5) | is.na(test$col2) & (test$col1 > 5) | !is.na(test$col1|test$col2) & (test$col2 > 5 & test$col2 > 5), "是", "否") - Shirin Yavari
可能是处理TRUE、FALSE、NA和NaN的问题的重复。 - astrofunkswag
@ShirinYavari 我认为你处理了 NA 的反向,它们应该最终变成“无”。如果我理解有误,请OP纠正我。 - astrofunkswag
基于问题中所展示的内容,这个回答是正确的,但你的回答却相反。是或不是?! - Shirin Yavari
哦,我看到了帖子的那一部分,那就是原帖作者想要的,但这将与将NA视为false不一致,应该忽略/将其视为true。 - astrofunkswag
4个回答

0

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

test$G5 <- 如果(test$col1 > 5 & test$col2 > 5)%在%TRUE中,则为“是”,否则为“否”

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

请参阅此帖子以获取更多信息


0
对我来说,最有益的方法应该是使用 dplyrcase_when 函数,并明确说明如何处理你提到的 NA 情况。
复制你的示例(请注意,我在此处明确设置了 NAs。你的 NAs 是由于 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”,因为这显然对于之前的条件未满足的所有其他情况都会被评估为真。

这应该可以实现您想要的功能:

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

0

这里有一种方法,不需要使用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

0
这是另一种使用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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接