Comment ignorer NA dans ifelse déclaration
Je suis venu à la R de SAS, où numériques manquant est réglée sur l'infini. Donc, nous pouvons simplement dire:
positiveA = A > 0;
Dans R, je dois être détaillé comme:
positiveA <- ifelse(is.na(A),0, ifelse(A > 0, 1, 0))
Je trouve cette syntaxe est difficile à lire. Est-il de toute façon, je peux modifier ifelse fonction de considérer NA une valeur spéciale qui est toujours faux pour tous les comparaison conditions? Si pas, compte tenu de NA que -Inf sera trop de travail.
De même, le paramètre NA " (vide) dans ifelse déclaration pour les variables caractères.
Grâce.
Comme tout le monde l'a déjà dit: ne PAS remplacer NA avec des logiques ou des valeurs numériques. De nombreuses fonctions R ont une "na.rm=TRUE/FALSE" ou similaire argument pour vous permettre de traiter vos données de manière appropriée. Si SAS distingue vraiment des choses à Inf, ils sont la violation fondamentale de l'ordinateur les règles mathématiques (pour ne pas mentionner que Inf est déductible au titre d'un résultat d'une expression mathématique, comme c'est NaN (= 0/0 , par exemple)) ; alors que NA signifie quelque chose de complètement différent. Une fois que vous vous habituez à la philosophie de la R, vous serez plus à l'aise permettant de NA de rester NA.
OriginalL'auteur AdamNYC | 2012-11-28
Vous devez vous connecter pour publier un commentaire.
Cette syntaxe est plus facile à lire:
(À l'extérieur des parenthèses ne sont pas nécessaires, mais la déclaration la plus facile à lire pour presque n'importe qui d'autre que de la machine.)
Modifier:
Enfin, vous pouvez faire la chose entière dans une fonction:
positiveA <- ifelse(x > 0 & !is.na(x), 1, 0)
du mieux que je peux obtenir?Merci. Il n'y a vraiment pas besoin ici de toute
ifelse()
appel. (Voir mon edit.)J'ai réellement besoin de convertir T/F pour 1/0 pour l'agréger. (La déclaration de SAS me donne 1/0). Est-il un meilleur moyen de le faire dans R (c'est à dire, en évitant ifelse).
*1 est génial! Merci beaucoup
Juste pour votre référence, il est basé sur le fait que les opérateurs arithmétiques "[contraindre logique vecteurs] d'entier ou numérique vecteurs, ‘FAUX’ avoir la valeur zéro et ‘TRUE’ avoir de la valeur." (Texte cité de
?Arithmetic
, a également atteint par?*
.) Essayez égalementsum(c(TRUE, TRUE, FALSE)); TRUE + c(TRUE, FALSE)
, etc.OriginalL'auteur Josh O'Brien
Remplacement d'un
NA
valeur zéro semble plutôt étrange comportement à attendre.R
considèreNA
valeurs manquantes (bien caché loin derrière les scènes où vous (jamais) le besoin d'aller, et ils sont négatifs très grand nombre lorsque numériques ))Tout ce que vous devez faire est de
A>0
ouas.numeric(A>0)
si vous voulez 0,1 pas VRAI , FAUXnoter que
ifelse(A>0, 1,0)
serait aussi travailler.La
NA
valeurs sont "retenus", ou traité de façon appropriée.R
est ici flagrant.Oui, R est sensible. Si quelque chose est
NA
, puisR
de considérerNA
, cependant, très profond dans le code source (en C ou en FORTRAN, ces NA les valeurs seront de très grandes valeurs négatives, mais il est rarement de tout souci, sauf si vous êtes de fouiller là.Dans ce cas, le
NA
est ignoré par l'état, qui est ce que vous voulez, vous n'avez pas envie de le remplacerNA
avec0
, parce queNA
implique des valeurs manquantes.À partir de de données.la table -- je suis croyant Matthieu Dowle ici, mais je suppose qu'il a fait le nécessaire à la recherche.
Il y aura de meilleures façons de imbriquée ifelse consolidés.
OriginalL'auteur mnel
Essayez ceci:
OriginalL'auteur Peter S
Si vous travaillez avec des entiers, vous pouvez utiliser %en%
Par exemple, si votre nombre peut aller jusqu'à 2
d'autres personnes ont suggéré d'utiliser
ma solution est plus simple et vous donne le même résultat.
OriginalL'auteur skan