我在使用嵌套的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)))))))
答案 0 :(得分:2)
你基本上有一组二进制检查,每个检查都返回TRUE
或FALSE
,如果它们都不是真的。因此,只需将所有支票matrix
或list
组合在一起就很简单了:
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}}。
作为旁注,使用FALSE
或1
之类的变量名称只是在寻找麻烦。
可行的可重复数据:
2