如何解决如何在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 => 1
和FALSE => 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”
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。