处理行操作中丢失的数据

yoo*_*oo 5 row r rowsum rowwise

ID <- 1:6
math <- c("YES","NO","YES","NO",NA,NA)
history <- c(NA,NA,"NO","NO","YES",NA)

dt <- data.frame(ID, math, history)

  ID math history
1  1  YES    <NA>
2  2   NO    <NA>
3  3  YES      NO
4  4   NO      NO
5  5 <NA>     YES
6  6 <NA>    <NA>
Run Code Online (Sandbox Code Playgroud)

我想添加一个附加列(“pass”),如下所示

  1. 如果学生至少说过一次“是”:“是”(无论其他科目是否缺少数据等等。)

  2. 如果学生没有回答“是”

    • 如果两个受试者都缺少数据:NA
    • 如果其中一个科目为“否”:“否”

所以,列会像这样:(我可以使用这个最小的示例手动执行此操作,但不能使用我的真实数据)

> dt
  ID math history pass
1  1  YES    <NA>  YES
2  2   NO    <NA>   NO
3  3  YES      NO  YES
4  4   NO      NO   NO
5  5 <NA>     YES  YES
6  6 <NA>    <NA> <NA>
Run Code Online (Sandbox Code Playgroud)

我尝试使用

> dt
  ID math history pass
1  1  YES    <NA>  YES
2  2   NO    <NA>   NO
3  3  YES      NO  YES
4  4   NO      NO   NO
5  5 <NA>     YES  YES
6  6 <NA>    <NA> <NA>
Run Code Online (Sandbox Code Playgroud)

这段代码,但这很棘手,因为如果我输入na.rm=TRUE他们认为 NA 是“NO”(ID 6 学生将是“NO”)

如果我输入na.rm=FALSE,则仅考虑具有两个科目数据的学生。

在我的数据中,我有很多专栏,不仅仅是数学和历史。

Dar*_*sai 6

一个简单的base解决方案是

dt$pass <- apply(dt[-1], 1, \(x) sort(x, dec = TRUE)[1])

# > dt
#   ID math history pass
# 1  1  YES    <NA>  YES
# 2  2   NO    <NA>   NO
# 3  3  YES      NO  YES
# 4  4   NO      NO   NO
# 5  5 <NA>     YES  YES
# 6  6 <NA>    <NA> <NA>
Run Code Online (Sandbox Code Playgroud)

它的dplyr等价是

library(dplyr)

dt %>%
  rowwise() %>%
  mutate(pass = sort(c_across(-1), dec = TRUE)[1]) %>%
  ungroup()
Run Code Online (Sandbox Code Playgroud)