2014-04-24 8 views
2

Je souhaite renvoyer une valeur dans une colonne, ou NA, en fonction des valeurs des autres colonnes.Comment écrire correctement cette instruction ifelse dans R

Je veux essentiellement voir si la valeur de la colonne répond aux premiers critères de test:

df$v2.1 >= df$varx & df$v3.1 <6 

sinon répond-il à la seconde:

df$v4.1 >= df$vary & df$v5.1 >5 

et si aucun retour NA

Le code que j'ai essayé est ci-dessous.

df$v1.1 = ifelse(df$v2.1 >= df$varx & df$v3.1 <6 || df$v4.1 >= df$vary & df$v5.1 >5 ,df$v1.1, NA) 

Répondre

1

D'après ce que je peux dire V1.1 $ df est déjà défini, de sorte que vous ne devez modifier les lignes qui échouent le test dans votre ifelse. Ce qui suit est peut-être plus facile:

df$v1.1[ 
    which(
    !(df$v2.1 >= df$varx & df$v3.1 <6) & !(df$v4.1 >= df$vary & df$v5.1 >5)) 
    ] <- NA 
2

Votre seule erreur utilise || plutôt que |. || n'est pas vectorisé et ne considère que le premier élément. Tous vos autres opérateurs (et ifelse()) sont vectorisés, de sorte que les éléments suivants devraient fonctionner comme prévu:

df$v1.1 = ifelse(df$v2.1 >= df$varx & df$v3.1 <6 | df$v4.1 >= df$vary & df$v5.1 > 5, df$v1.1, NA) 

Une bonne façon de vérifier quand vous faites raisonnablement des opérations complexes ou plusieurs logiques consiste à exécuter chacun d'entre eux et voyez si vous obtenez la sortie attendue. Si vous exécutez:

df$v2.1 >= df$varx & df$v3.1 <6 

ou

df$v4.1 >= df$vary & df$v5.1 > 5 

vous devriez obtenir un vecteur de valeurs logiques. Si vous exécutez:

df$v2.1 >= df$varx & df$v3.1 <6 || df$v4.1 >= df$vary & df$v5.1 > 5 

vous devriez obtenir une seule valeur logique. Dans votre cas, cela donnera un résultat unique à partir du ifelse(), qui sera ensuite recyclé pour remplir df$v1.1.

+0

Merci Alex, cela a fonctionné pour moi ainsi que la réponse ci-dessous. L'explication a été très appréciée. – Ash

Questions connexes