Traiter avec la valeur TRUE, FALSE NA et NaN
Ici est un vecteur
a <- c(TRUE, FALSE, FALSE, NA, FALSE, TRUE, NA, FALSE, TRUE)
Je voudrais une simple fonction qui renvoie TRUE
chaque fois qu'il y a TRUE
en "une", et FALSE
chaque fois qu'il y a FALSE
ou un NA
, "un".
Les trois choses suivantes ne fonctionnent pas
a == TRUE
identical(TRUE, a)
isTRUE(a)
Voici une solution
a[-which(is.na(a))]
mais il ne semble pas être une solution simple et efficace
Est-il une autre solution ?
Voici quelques fonctions (et les opérateurs) je sais:
identical()
isTRUE()
is.na()
na.rm()
&
|
!
-
Quelles sont les autres fonctions (opérateurs, des conseils, que ce soit,...) qui sont
utile de traiter avecTRUE
,FALSE
,NA
,NaN
? -
Quelles sont les différences entre
NA
etNaN
? -
Existe-il d'autres "logique des choses" que
TRUE
,FALSE
,NA
etNaN
?
Merci beaucoup !
- Pour répondre à votre première question, en voici une:
Vectorize(isTRUE)(a)
. - plus de justesse, je pense que
!is.na(x) & x
devrait fonctionner, aussi longtemps que les valeurs que vous êtes enceinte sont certainement contenue dans {TRUE
,FALSE
,NA
,NaN
} ... - Nice solutions !
- J'ai envie de certains de ces distinctions (
NA
vsNaN
,isTRUE
vsis.na
, etc.) doit avoir été discuté ailleurs, auparavant, peut-être même sur StackOverflow. Googler "na nan est.le fini est.nan est.na" me stat.ethz.ch/R-manual/R-devel/library/base/html/is.finite.html , qui curieusement n'a pas un "Voir aussi" à stat.ethz.ch/R-manual/R-devel/library/base/html/NA.html - pour être complet, j'ajouterai
all.equal
,is.finite
, etis.nan
à votre liste ci-dessus ... - NaN est numérique donc vous ne pouvez pas rencontrer dans une logique de vecteur. La solution proposée
a[-which(is.na(a))]
a seulement 7 éléments alors quea
a 9 éléments. Êtes-vous sûr que c'est ce que vous voulez? Peut-êtresapply(a, isTRUE)
est ce que vous voulez? - Juste un rapide, tangentielle commentaire concernant la dernière partie de la question: "existe-t-il d'autres "logique des choses" que de T,F,NA, NaN?" --
T
etF
sont pas, en général, égale àTRUE
etFALSE
; c'est à dire, ils ne sont pas des mots réservés et peuvent à tout moment être redéfini par l'utilisateur. Cela signifie que vous devez être prudent de les traiter en tant que tel; par exemple,T <- FALSE
peut vraiment ruiner votre journée.
Vous devez vous connecter pour publier un commentaire.
Pour répondre à vos questions dans l'ordre:
1) Le
==
opérateur n'a en effet pas traiter de NA comme vous l'attendez. Une fonction très utile est cecompareNA
fonction de r-cookbook.com:2) NA signifie "Non disponible", et n'est pas la même que la valeur NaN ("not a number"). NA est généralement utilisé pour une valeur par défaut pour un certain nombre de représenter des données manquantes; les NaN sont normalement générée à cause d'une question numérique (prise de journal de -1 ou similaire).
3) je ne suis pas vraiment sûr de ce que tu veux dire par "logique des choses"--beaucoup de différents types de données, y compris numériques vecteurs, peut être utilisé comme entrée d'opérateurs logiques. Vous voudrez peut-être essayer la lecture de la R opérateurs logiques page: http://stat.ethz.ch/R-manual/R-patched/library/base/html/Logic.html.
Espérons que cette aide!
Inf
, maisInf - Inf
vous donneNaN
. Un grand nombre de fois R les fonctions de lever une exception siNaN
s sont générés, par exemple,log(-1)
.Vous n'avez pas besoin de mettre quoi que ce soit dans une fonction - les ouvrages suivants
'%in%'(aamc$forgive, FALSE)
ce qui est utile pourapply
et de ses semblables.Si vous voulez un VRAI de rester VRAI et FAUX à rester FAUX, le seul vrai changement qui NA besoin afin de devenir de FAUX, il suffit donc de faire ce changement comme:
Ou vous pourriez reformuler pour dire que c'est VRAI seulement si, il est VRAI, et ne pas manquer:
La prise de Ben Bolker la suggestion ci-dessus vous pouvez définir votre propre fonction à la suite de la est.na() syntaxe
Cela fonctionne aussi pour les subsetting de données.
Et permet d'éviter accidentellement intégrant des lignes vides où NA existent dans les données.
ifelse()
ici -- comme @GregSnow la réponse de points,!is.na(x) & x
est équivalentJ'aime l'est.l'élément de la fonction: