如何在R中的if else语句中忽略多个列中的NA?

问题描述

我有一个看起来像这样的数据框:

     a    b   c   d
10 yes      yes yes yes
11 yes      yes yes yes
12 yes      yes yes yes
13 yes      yes yes yes
14 no      <NA>  no  no
15 no      <NA>  no  no
16 no      <NA>  no  no
17 no      <NA>  no  no
18 no      <NA>  no  no
19 no      <NA>  no  no
20 no      <NA>  no  no

我有一个if else语句,该语句基于对所有先前列的回答是“是”或“否”来创建一个值为1,0的新列。但是我的代码没有考虑NA。 这是我使用的代码

y <- x %>%
  mutate(
    health_ever = ifelse(
      e == 'yes    ' |
        b == 'yes' |
        c == 'yes' |
        d == 'yes',1,0
    )
  )

以下是复制代码

x<-structure(
  list(
    a = structure(
      c(6L,6L,7L,7L),.Label = c(
        "missing","inapplicable","proxy respondent       ","refusal","don't kNow","yes    ","no     "
      ),class = "factor"
    ),b = structure(
      c(6L,NA,NA),"proxy","yes","no"
      ),c = structure(
      c(6L,d = structure(
      c(6L,class = "factor"
    )
  ),row.names = 10:20,class = "data.frame"
)

如何更改我的代码以忽略所有NA,而根据其他列仍给出1,0。这是我想要的输出

     a            b        c        d            e
1   yes          yes      yes      yes           1
2   yes          yes      yes      yes           1
3   yes          yes      yes      yes           1
4   yes          yes      yes      yes           1
5   no          <NA>       no       no           0
6   no          <NA>       no       no           0
7   no          <NA>       no       no           0
8   no          <NA>       no       no           0

解决方法

在逻辑矩阵上使用rowSums可以返回每一行中NA的数量计数。如果返回0,则表示该行中没有NA。通过取反(!)可以将其转换为逻辑,以将0更改为TRUE,并将所有其他值更改为FALSE。然后使用as.integer+将其强制转换为二进制文件,即TRUE => 1FALSE => 0

x$e <- +(!rowSums(is.na(x)))

基于OP的代码,它正在检查“是”值,也可以使用rowSums

x$e <- +(rowSums(x == 'yes',na.rm = TRUE) > 0)

即计算每行中的“是”值,用NA除去na.rm = TRUE,通过检查计数是否大于0转换为逻辑,并用+

强制转换为二进制>

如果我们要检查所有列是否都为“是”

x$e <- +(rowSums(x == 'yes',na.rm = TRUE) == ncol(x))

 

-输出

x
#         a    b   c   d e
#10 yes      yes yes yes 1
#11 yes      yes yes yes 1
#12 yes      yes yes yes 1
#13 yes      yes yes yes 1
#14 no      <NA>  no  no 0
#15 no      <NA>  no  no 0
#16 no      <NA>  no  no 0
#17 no      <NA>  no  no 0
#18 no      <NA>  no  no 0
#19 no      <NA>  no  no 0
#20 no      <NA>  no  no 0

在OP的代码中,e == 'yes '中有一个前导空格,并且'e'不是初始数据集中的一列。也许是“ a”