ifelse语句语法多个条件被破坏

时间:2017-10-30 22:13:28

标签: r if-statement

我在使用嵌套的ifelse语句时遇到了一些麻烦。我编写了以下代码。它应该强制为TRUE或FALSE,但我得到一些NA。你能帮我弄清楚它坏了吗?

数据看起来像......

Name<- c(Jon,Jim,Jake,Jess,Jill,Jay,Jason)
LinkFlag<- c( NA,  NA,  NA,  NA,  NA, NA, NA)
1<- c(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0)
2<- c(2.5,  NA,  NA,  NA,  NA, 3.0,  NA)

spread_wide<-c(Name,LinkFlag,1,2)

预期结果是没有NAs

sw_RESULTS$EvalSeq1to2<-ifelse(spread_wide$`1` == 99, TRUE, 
                   ifelse(spread_wide$`1` == (spread_wide$`2`-1), TRUE,  
                           ifelse(is.na(spread_wide$`2`),TRUE,   
                                       ifelse(spread_wide$`2` ==99,TRUE,
                                            ifelse(spread_wide$`1`== (spread_wide$`2`-0.5),TRUE, 
                                                       ifelse(spread_wide$`1` == spread_wide$`2`, TRUE,  
                                                                   ifelse(spread_wide$`LinkFlag`=='FlagforSkip", TRUE,
                                                                                                                                 FALSE)))))))

1 个答案:

答案 0 :(得分:2)

你基本上有一组二进制检查,每个检查都返回TRUEFALSE,如果它们都不是真的。因此,只需将所有支票matrixlist组合在一起就很简单了:

checks <- with(spread_wide,
  cbind(
    `1` == 99,
    `1` == `2` - 1,
    is.na(`2`),
    `2` == 99,
    `1` == (`2` - 0.5),
    `1` == `2`,
    LinkFlag == 'FlagforSkip'
  )
)

rowSums(checks, na.rm=TRUE) > 0
#[1] FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE

最后一行的秘诀在于使用na.rm=TRUE,因此您永远不会考虑NA == 1之类的比较,而这些比较会返回NA而不是TRUE或{ {1}}。

作为旁注,使用FALSE1之类的变量名称只是在寻找麻烦。

可行的可重复数据:

2