2016-12-31 7 views
2

以下のコードでは、なぜ2番目のifelse()が評価されないのか分かりません。誰か説明できますか? ifelseステートメントを書き直すには?2番目のifelseが評価されないのはなぜですか?

最後の行のy1==1y2==1が一致し、列結果は1で埋められる必要があります。

df <- data.frame(x1=c(0,0,NA,NA,NA),y1=c(NA,NA,NA,NA,1),x2=c(0,NA,NA,0,NA), 
       y2=c(1,NA,NA,NA,1)) 

df$result <- with(df, ifelse((x1==0 & x2==0), 0, ifelse((y1==1 & y2==1), 1, 100))) 
+2

rowSumsで試すことができます示唆している 'NA'が真でも偽でもありません。条件x1 == 0&x2 == 0は 'T NA NA NA'を返します。この場合、' ifelse'は 'NA'を返します。 –

答えて

3

この試してみてください:あなたはif()とを使用したい場合はapply()if()

を使用して

> df 
    x1 y1 x2 y2 result 
1 0 NA 0 1  0 
2 0 NA NA NA  NA 
3 NA NA NA NA  NA 
4 NA NA 0 NA  NA 
5 NA 1 NA 1  1 

ソリューション:

df$result <- with(df, ifelse((x1==0 & x2==0) & !is.na(x1==0 & x2==0), 0, 
          ifelse((y1==1 & y2==1), 1, 100))) 

の検索結果をの代わりifelse()を行う:

df$result = apply(df,1,function(x){ 

    if(is.na(x["x1"]==0 & x["x2"]==0) & is.na(x["y1"]==1 & x["y2"]==1)){ 
     return(NA) 
    } 

    if(!is.na(x["x1"]==0 & x["x2"]==0) & (x["x1"]==0 & x["x2"]==0)){ 
     return(0) 
    }else if(!is.na(x["y1"]==1 & x["y2"]==1) & (x["y1"]==1 & x["y2"]==1)){ 
     return(1) 
    }else{ 
     return(100) 
    } 

}) 

結果は上記と同様です。

+0

ああ、そうです。私はそれを見落とした。 if()文を使って解を提供してもらえますか?私はそれを理解できませんでした。ありがとう。 – Maximilian

+0

'if()'は 'ifelse'としてベクトル化されていませんが、論理条件は同じでなければなりません。 –

+0

はい、私はベクトル化されていないことを知っています。このため、if()ステートメント、特に4つの列を適用するのが問題になります。私はこれがどのように手がかりになるのか疑問に思います。私は、 'apply'関数の1つが適用されなければならないことを理解していますが、どうですか? – Maximilian

1

NAを評価することはできません。 (x1==0 & x2==0)があることに注意してくださいTRUE, NA, NA, NA のでifelse( (df$x1==0 & df$x2==0), 0, "Something)0, NA, NA, NA

は、私は、次の

library(dplyr) 
df$result <- case_when(df$x1==0 & df$x2==0 & !is.na(df$x1) & !is.na(df$x2) ~ 0, 
        df$y1==1 & df$y2==1 ~ 1, 
        TRUE ~ 100)) 
+1

'case_when'私は' dplyr'関数と思われます、そうですか?もしそうなら、これはあなたの答えに述べるべきです。ありがとう。 – Maximilian

+0

ありがとう私は –

2

我々はpmax

df$result <- pmax(+(!!rowSums(df[c(TRUE, FALSE)])), 
      +(!!rowSums(df[c(FALSE, TRUE)])), na.rm = TRUE) 
df$result 
#[1] 0 NA NA NA 1 
+1

非常に革新的で興味深い答えを更新します、ありがとうございます。私はまた、if()文の解決策を探しています、あなたはそれを行う方法を示すことができますか?これは4つの列を含み、if()がベクトル化されていない場合、これをどのように行うことができるのか非常に興味があります。どうもありがとう! – Maximilian

+0

@Maximilian 'for'ループの各行をループし、' if/else'を使用します。 – akrun

+0

ああ、これは唯一の方法だと思っていました。私はループ以外のより良い方法があると思った。どうもありがとう! – Maximilian

関連する問題