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