为什么没有评估第二个ifelse?

时间:2016-12-31 14:39:31

标签: r if-statement

在下面的代码中,我不明白为什么不评估第二个ifelse()。有人可以解释一下吗?如何重写ifelse语句?

最后一行中的y1==1y2==1匹配,列结果应填充1

df <- data.frame(x1=c(0,0,NA,NA,NA),y1=c(NA,NA,NA,NA,1),x2=c(0,NA,NA,0,NA),
                 y2=c(1,NA,NA,NA,1))

df$result <- with(df, ifelse((x1==0 & x2==0), 0, ifelse((y1==1 & y2==1), 1, 100)))

3 个答案:

答案 0 :(得分:3)

试试这个:

df$result <- with(df, ifelse((x1==0 & x2==0) & !is.na(x1==0 & x2==0), 0,
                             ifelse((y1==1 & y2==1), 1, 100)))

结果:

> df
  x1 y1 x2 y2 result
1  0 NA  0  1      0
2  0 NA NA NA     NA
3 NA NA NA NA     NA
4 NA NA  0 NA     NA
5 NA  1 NA  1      1

使用apply()if()

的解决方案

如果您想使用if()apply()代替ifelse(),请执行以下操作:

df$result = apply(df,1,function(x){

    if(is.na(x["x1"]==0 & x["x2"]==0) & is.na(x["y1"]==1 & x["y2"]==1)){
        return(NA)
    }

    if(!is.na(x["x1"]==0 & x["x2"]==0) & (x["x1"]==0 & x["x2"]==0)){
        return(0)
    }else if(!is.na(x["y1"]==1 & x["y2"]==1) & (x["y1"]==1 & x["y2"]==1)){
        return(1)
    }else{
        return(100)
    }

})

结果与上述相同。

答案 1 :(得分:2)

我们可以尝试使用pmaxrowSums

df$result <- pmax(+(!!rowSums(df[c(TRUE, FALSE)])), 
          +(!!rowSums(df[c(FALSE, TRUE)])), na.rm = TRUE)
df$result
#[1]  0 NA NA NA  1

答案 2 :(得分:1)

无法评估NA。请注意(x1==0 & x2==0)TRUE, NA, NA, NA 因此ifelse( (df$x1==0 & df$x2==0), 0, "Something)0, NA, NA, NA

我建议以下

library(dplyr)
df$result <- case_when(df$x1==0 & df$x2==0 & !is.na(df$x1) & !is.na(df$x2) ~ 0,
                   df$y1==1 & df$y2==1 ~ 1,
                   TRUE ~ 100))