web-dev-qa-db-ja.com

複数の条件を持つRのIfelseステートメント

次のサンプルデータでは、3つの条件変数(Denial1、Denial2、およびDenial3)の値に基づいて、新しい変数 "Den"(値 "0"または "1")を作成しようとしています。

3つの条件変数のいずれかに「0」と「1」が含まれる場合、値が含まれる各条件変数の値が「1」(NAではないなど)の場合にのみ「0」が必要です。

structure(list(Denial1 = NA_real_, Denial2 = 1, Denial3 = NA_real_, 
Den = NA), .Names = c("Denial1", "Denial2", "Denial3", "Den"
), row.names = 1L, class = "data.frame")

「Den」の欠損値NAをもたらす次のコマンドの両方を試しました。

DF$Den<-ifelse (DF$Denial1 < 1 | DF$Denial2 < 1 | DF$Denial3 < 1, "0", "1")

DF$Den<-ifelse(DF$Denial1 < 1,"0", ifelse (DF$Denial2 < 1,"0", ifelse(DF$Denial3 < 1,"0", "1")))

誰かがこれを行う方法を示すことができますか?

9
user3594490

@jaimedashと@Old_Mortalityからの提案に基づいて、私は解決策を見つけました:

DF$Den <- ifelse(DF$Denial1 < 1 & !is.na(DF$Denial1) | DF$Denial2 < 1 &  
!is.na(DF$Denial2) | DF$Denial3 < 1 & !is.na(DF$Denial3), "0", "1")

次に、条件変数のすべての値がNAである場合にNAの値を保証するには:

DF$Den <- ifelse(is.na(DF$Denial1) & is.na(DF$Denial2) & is.na(DF$Denial3), 
NA, DF$Den)
12
user3594490

どう?

DF$Den<-ifelse (is.na(DF$Denial1) | is.na(DF$Denial2) | is.na(DF$Denial3), "0", "1")
3
Old_Mortality

これにはもっと簡単な解決策があります。あなたが説明するのは、&演算子であり、したがって原始的に行うことができます。

> c(1,1,NA) & c(1,0,NA) & c(1,NA,NA)
[1]  TRUE FALSE    NA

すべてが1の場合、1が返されます。いずれかが0の場合、0です。すべてがNAの場合、NAです。

あなたの場合、コードは次のようになります。

DF$Den<-DF$Denial1 & DF$Denial2 & DF$Denial3

これが機能するためには、characterでの作業を停止し、numericまたはlogicalタイプを使用する必要があります。

3
Craig

anyの非常に簡単な使用

df <- <your structure>

df$Den <- apply(df,1,function(i) {ifelse(any(is.na(i)) | any(i != 1), 0, 1)})
2
Alex W

dplyrを使用する別のソリューションは次のとおりです。

df <- ## your data ##
df <- df %>%
        mutate(Den = ifelse(any(is.na(Den)) | any(Den != 1), 0, 1))
0
ahreje