删除/忽略if循环中的NA值

时间:2013-03-28 14:26:01

标签: r if-statement na

所以我有这个简单的if循环

chick<-lapply(1:length(t),function(i){
if(t[[i]]<0.01){
chick=1
}else 0 
})

所以基本上当t <0.01时打印输出1如果不打印0但有时候我的数据具有NA值,如下所示....我怎么能指定NA值0以及因为我如果我不这样做会收到类似的错误:

Error in if (t[[i]] < 0.01) { : missing value where TRUE/FALSE needed

以下是名为't'

的数据的示例输出
[[1]]
[1] NA

[[2]]
[1] NA

[[3]]
[1] 0.01

再次感谢

4 个答案:

答案 0 :(得分:3)

使用is.na

if(t[!is.na(t)][[i]]<0.01) ...

更重要的是,因为您要分配给chick,所以不要尝试在lapply(或类似)语句中进行分配。它会给你不同于你期望的结果。而是尝试

chick <- lapply(1:length(t),function(i)  
  if(t[!is.na(t)][[i]]<0.01)  1  else 0 
)

或者更好的是,使用ifelse。

chick <- ifelse(t[!is.na(t)] < 0.01, 1, 0)

如果您希望chickt的长度相同,请使用“|” ifelse的运营商。正如NPE所建议的那样(但在|中使用单||而不是ifelse

答案 1 :(得分:0)

以下内容检查t[[i]]NA还是0.01

if (is.na(t[[i]]) || t[[i]] < 0.01) {
   ....

答案 2 :(得分:0)

或者你可以使用......

chick <- numeric( length(t) )
chick[ t < 0.01 ] <- 1 

...并避免循环并完全检查NA。

答案 3 :(得分:0)

为什么不这样做(反转测试并为互补测试和NA返回0):

 chick <- ifelse(is.na(t)|t>=0.01, 0, 1)

这应该有效,因为FALSE | NA将返回FALSE。请参阅“逻辑”页面。使用lapply进行循环也更有效。我想如果你需要列表格式的结果,你可以eitehr做as.list到结果或使用:

     if( is.na(t) || t>=0.01 ) { 0 }else{ 1 }