1

だから私はこの単純なifループを持っています

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

したがって、基本的にt<0.01の場合、0を出力しない場合は1を出力しますが、以下のような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) ...

ただし、さらに重要なのは、に割り当てているため、 (または同様の) ステートメント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 で提案されているように (ただし、単一の|not||を使用ifelse)

于 2013-03-28T14:27:40.760 に答える
0

または、単に使用できます...

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

...そしてループを避けてNAを完全にチェックします。

于 2013-03-28T14:32:29.277 に答える
0

が以下のt[[i]]いずれかであるかどうかをチェックして、次のようにします。NA0.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 を返すため、これは機能するはずです。?ロジックのページを参照してください。でループするよりも効率的ですlapply。リスト形式の結果が必要な場合は、結果に対して as.list を実行するか、次を使用できます。

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