在下面的代码中,我不明白为什么不评估第二个ifelse()
。有人可以解释一下吗?如何重写ifelse
语句?
最后一行中的y1==1
和y2==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)))
答案 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)
我们可以尝试使用pmax
和rowSums
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))