2016-10-19 14 views
2

ifelseとis.naを使って新しい変数を作成したい。 しかし問題は、このifelseが1とNAだけを返すということです。 問題は最初のifelseにあるようです。なぜなら私はifelseを1つずつ実行し、最初のものだけがNAを返すからです。私はなぜ、3 ifelseのコードが似ているように見えるので、理解できません。誰か知っていますか?私はRでis.naを使うとベクトルはFALSEではなくNAを返す

eassociacao<-ifelse((!is.na(dados$CENTRAL)|dados$CENTRAL!=" ") & 
        (!is.na(dados$SISTEMA)|dados$SISTEMA!=" "),1, 
        ifelse((!is.na(dados$CENTRAL)|dados$CENTRAL!=" ") & 
          (is.na(dados$SISTEMA)|dados$SISTEMA==" "),2,3)) 
+1

私は最初に '|'を '&'で置き換えたいと考えています – HubertL

+0

これを試してください: 'eassociacao <-ifelse((!is isna(dados $ CENTRAL)!=" ")&(!is.na( (dados $ SISTEMA)== "))、2、3)$$$$ $$$$$$$$$$$$$$$$$$$$$ '。動作しない場合は、再現可能な例を表示してください。 – cimentadaj

+0

@cimentadajこれは悪いことです。あなたは '!is.na()'の結果が '!='から '' ''になっているかどうかをテストしています。意味がない。 – Gregor

答えて

2

ネストされたifelseを使用しないように3、非常に良い理由があります。

  1. 彼らは直感的であり、多くの場合、ミスにつながります。
  2. あなたが1年後に戻ってくるとき、彼らは理解しづらいです。
  3. これらは、より明確な選択肢として機能しません。あなたが実際に欲しいものを得るための条件を分割する必要があり

    eassociacao <- rep(NA_integer_, nrow(dados) # initialize 
    c1 <- !is.na(dados$CENTRAL) & dados$CENTRAL!=" " # condition 1 
    c2 <- (!is.na(dados$SISTEMA) & dados$SISTEMA!=" ") # condition 2 
    c3 <- (is.na(dados$SISTEMA) & dados$SISTEMA==" ") # condition 3 
    
    eassociacao[c1 & c2] <- 1 # Push 1 where c1 and c2 are TRUE 
    eassociacao[c1 & c3] <- 2 # Push 2 where c1 and c3 are TRUE 
    eassociacao[c1 & !c3] <- 3 # Push 3 where c1 and not c3 are TRUE 
    

は、ここでの例です。しかし、私は、このアプローチはあなたに時間と費用を節約し、将来的には落ち着かせると言います。

+0

あなたが言ったように私はやってみましたが、問題は条件にあります。どういうわけか、FALSEの代わりにNAと表示されています。 –

+0

c1 < - !is.na(dados $ CENTRAL)| dados $ CENTRAL!= "" c2 < - is.na(dados $ CENTRAL)| dados $ CENTRAL == "" c3 < - !is.na(dados $ SISTEMA)| dados $ SISTEMA!= "" c4 < - is.na(dados $ SISTEMA)| dados $ SISTEMA == "" –

+0

私は関数または関数に問題があります –

関連する問題