1

所以我有这个简单的 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

4 回答 4

3

利用is.na

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

更重要的是,由于您正在分配 to 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)

如果您想chick与 的长度相同t,请使用 '|' ifelse 中的运算符。正如 NPE 所建议的(但使用 single |not ||in ifelse

于 2013-03-28T14:27:40.760 回答
0

以下检查是否t[[i]]NA或小于0.01

if (is.na(t[[i]]) || t[[i]] < 0.01) {
   ....
于 2013-03-28T14:28:24.933 回答
0

为什么不只是这个(反转测试并为补充测试和 NA 返回 0):

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

这应该有效,因为 FALSE|NA 将返回 FALSE。请参阅 ?Logic 页面。使用 循环也更有效lapply。我想如果您需要列表格式的结果,您可以对结果执行 as.list 或使用:

     if( is.na(t) || t>=0.01 ) { 0 }else{ 1 }
于 2013-03-28T14:42:10.697 回答
0

或者你可以使用...

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

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

于 2013-03-28T14:32:29.277 回答