web-dev-qa-db-fra.com

Instruction ifelse en R avec plusieurs conditions

Avec les exemples de données suivants, j'essaie de créer une nouvelle variable "Den" (valeur "0" ou "1") basée sur les valeurs de trois variables conditionnelles (Denial1, Denial2 et Denial3).

Je veux un "0" si TOUTES les trois variables conditionnelles ont un "0" et un "1" seulement si CHAQUE variable conditionnelle qui a une valeur a une valeur de "1" (par exemple, n'est pas NA).

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

J'ai essayé les deux commandes suivantes qui entraînent une valeur manquante NA pour "Den":

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")))

Quelqu'un pourrait-il montrer comment procéder?

9
user3594490

Sur la base des suggestions de @jaimedash et @Old_Mortality, j'ai trouvé une solution:

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")

Ensuite, pour garantir une valeur de NA si toutes les valeurs des variables conditionnelles sont NA:

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

Que diriez-vous?

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

Il existe une solution plus simple à cela. Ce que vous décrivez est le comportement naturel du & et peut donc se faire de manière primitive:

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

Si tous sont 1, 1 est retourné. Si certains sont 0, alors 0. Si tous sont NA, alors NA.

Dans votre cas, le code serait:

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

Pour que cela fonctionne, vous devrez arrêter de travailler dans character et utiliser les types numeric ou logical.

3
Craig

Utilisation très simple de any

df <- <your structure>

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

une autre solution utilisant dplyr est:

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