R中的> =和ifelse出现问题

时间:2014-02-27 23:00:35

标签: r if-statement

这与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)time1time2不是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)?抱歉这个愚蠢的问题!

1 个答案:

答案 0 :(得分:4)

test2$ID <- with(test2, ifelse( (!is.na(time1) | !is.na(time2)) &
                   size >= 2 &
                   !type %in% c("C", "D"), 6, NA))

是的,就像你说你可以使用括号强制&|之前评估。