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?
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)
Que diriez-vous?
DF$Den<-ifelse (is.na(DF$Denial1) | is.na(DF$Denial2) | is.na(DF$Denial3), "0", "1")
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
.
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)})
une autre solution utilisant dplyr est:
df <- ## your data ##
df <- df %>%
mutate(Den = ifelse(any(is.na(Den)) | any(Den != 1), 0, 1))