所以我有这个简单的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
再次感谢
答案 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)
如果您希望chick
与t
的长度相同,请使用“|” 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 }