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”),如下所示
如果学生至少说过一次“是”:“是”(无论其他科目是否缺少数据等等。)
如果学生没有回答“是”
所以,列会像这样:(我可以使用这个最小的示例手动执行此操作,但不能使用我的真实数据)
> 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,则仅考虑具有两个科目数据的学生。
在我的数据中,我有很多专栏,不仅仅是数学和历史。
一个简单的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)
| 归档时间: |
|
| 查看次数: |
156 次 |
| 最近记录: |