这与R: How to include NA in ifelse?上的上一个问题有关。我正在尝试使用来自许多不同列的值基于逻辑测试创建列ID
。对于以下示例数据帧:
test2 <- structure(list(time1 = c(10L, 20L, NA, NA), time2 = c(5L, NA,
10L, NA), size = 1:4, type = structure(1:4, .Label = c("A", "B",
"C", "D"), class = "factor"), ID = c("6", "6", NA, NA)), .Names = c("time1",
"time2", "size", "type", "ID"), row.names = c(NA, -4L), class = "data.frame")
看起来像
time1 time2 size type
1 10 5 1 A
2 20 NA 2 B
3 NA 10 3 C
4 NA NA 4 D
我想在满足以下条件时创建包含值6的列ID
:1)time1
或time2
不是NA,2){{1} }大于或等于2,且3)size
不等于C或D.我一直在尝试以下代码:
type
出于某种原因,&#34;大于或等于2&#34;声明不正常。这段代码给了我解决方案
test2$ID <- ifelse(is.na(test2$time1) & is.na(test2$time2) & test2$size >= 2 | test2$type %in% "C" | test2$type %in% "D", NA, "6")
但是,我需要的解决方案应该是
time1 time2 size type ID
1 10 5 1 A 6
2 20 NA 2 B 6
3 NA 10 3 C NA
4 NA NA 4 D NA
谁能告诉我我做错了什么?
另外:我很难理解逻辑运算符在R中是如何工作的。似乎这些是按顺序进行评估的,因此X&amp; Y | Z不等于Z | X&amp;是的,这是对的吗?我可以发表声明链接(X&amp; Y)| Z和这相当于Z | (X&amp; Y)?抱歉这个愚蠢的问题!
答案 0 :(得分:4)
test2$ID <- with(test2, ifelse( (!is.na(time1) | !is.na(time2)) &
size >= 2 &
!type %in% c("C", "D"), 6, NA))
是的,就像你说你可以使用括号强制&
在|
之前评估。