web-dev-qa-db-fra.com

Utilisation de l'instruction if else pour plusieurs conditions

Exemples de données:

x<-runif(100, min=0, max=1)
y<-runif(100, min=0, max=1)
dif<-x-y
dat<-data.frame(x,dif)

Ce que je veux faire, c'est créer une autre colonne dans le bloc de données dat appelée suit. Si x est inférieur à 0,15 et dif est inférieur à 0, que suit doit avoir une valeur de 3. Si x est inférieur à 0,15 et dif est supérieur à 0, que suit doit avoir une valeur de 2 et si dif est supérieur à 0, que suit a la valeur 1.

Ceci est le code que je suis préparé.

if(dat$x<0.15 & dat$dif<0){
   dat$suit<-3
} else {
if(dat$x>=0.15 & dat$dif<0){
   dat$suit<-2  
} else {
  dat$suit<-1  
 }
}

Il donne toutes les valeurs de dat$suit comme 1. Je ne suis pas sûr de ce que je fais mal ici.

Merci de votre aide.

7
user53020

Cela peut être fait en utilisant ifelse

with(dat, ifelse(x < 0.15 & dif <0, 3, ifelse(x > 0.15 & dif < 0, 2, 1)))

Ou

with(dat, as.numeric(factor(1+4*(x < 0.15 & dif < 0) + 2*(x>=0.15 & dif < 0))))
9
akrun

Le problème avec votre instruction est que if vérifie uniquement le premier élément de l'expression testée - vous devriez avoir reçu un avertissement. ifelse est vectorisé.

De plus, vous pouvez effectuer les tests dans l'ordre inverse pour une expression équivalente plus simple:

with(dat,
     ifelse(dif >= 0 , 1 , ifelse(x < 0.15, 3, 2))
)
5
Matthew Lundberg