Voici un vecteur
a <- c(TRUE, FALSE, FALSE, NA, FALSE, TRUE, NA, FALSE, TRUE)
J'aimerais une fonction simple qui renvoie TRUE
à chaque fois qu'il y a TRUE
dans "a" et FALSE
à chaque fois qu'il y a FALSE
ou NA
dans "a".
Les trois choses suivantes ne fonctionnent pas
a == TRUE
identical(TRUE, a)
isTRUE(a)
Voici une solution
a[-which(is.na(a))]
mais cela ne semble pas être une solution simple et facile
Y a-t-il une autre solution?
Voici quelques fonctions (et opérateurs) que je connais:
identical()
isTRUE()
is.na()
na.rm()
&
|
!
Quelles sont les autres fonctions (opérateurs, astuces, etc.) qui sont utiles pour traiter TRUE
, FALSE
, NA
, NaN
?
Quelles sont les différences entre NA
et NaN
?
Y a-t-il d'autres "choses logiques" que TRUE
, FALSE
, NA
et NaN
?
Merci beaucoup !
Pour répondre à vos questions dans l'ordre:
1) Le ==
L'opérateur ne traite en effet pas les NA comme vous vous y attendez. Une fonction très utile est cette fonction compareNA
de r-cookbook.com :
compareNA <- function(v1,v2) {
# This function returns TRUE wherever elements are the same, including NA's,
# and false everywhere else.
same <- (v1 == v2) | (is.na(v1) & is.na(v2))
same[is.na(same)] <- FALSE
return(same)
}
2) NA signifie "Non disponible" et n'est pas le même que le NaN général ("pas un nombre"). NA est généralement utilisé pour une valeur par défaut pour un nombre pour remplacer les données manquantes; Les NaN sont normalement générés à cause d'un problème numérique (prenant un log de -1 ou similaire).
3) Je ne suis pas vraiment sûr de ce que vous entendez par "choses logiques" - de nombreux types de données différents, y compris des vecteurs numériques, peuvent être utilisés comme entrée pour les opérateurs logiques. Vous voudrez peut-être essayer de lire la page des opérateurs logiques R: http://stat.ethz.ch/R-manual/R-patched/library/base/html/Logic.html .
J'espère que cela t'aides!
Vous n'avez pas besoin d'envelopper quoi que ce soit dans une fonction - les travaux suivants
a = c(T,F,NA)
a %in% TRUE
[1] TRUE FALSE FALSE
Donc, vous voulez que VRAI reste VRAI et FAUX reste FAUX, le seul vrai changement est que NA doit devenir FAUX, alors faites ce changement comme:
a[ is.na(a) ] <- FALSE
Ou vous pouvez reformuler pour dire que c'est VRAI seulement s'il est VRAI et non manquant:
a <- a & !is.na(a)
En prenant la suggestion de Ben Bolker ci-dessus, vous pouvez définir votre propre fonction en suivant la syntaxe is.na ()
is.true <- function(x) {
!is.na(x) & x
}
a = c(T,F,F,NA,F,T,NA,F,T)
is.true(a)
[1] TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE
Cela fonctionne également pour le sous-ensemble de données.
b = c(1:9)
df <- as.data.frame(cbind(a,b))
df[is.true(df$a),]
a b
1 1 1
6 1 6
9 1 9
Et permet d'éviter d'incorporer accidentellement des lignes vides là où NA existe dans les données.
df[df$a == TRUE,]
a b
1 1 1
NA NA NA
6 1 6
NA.1 NA NA
9 1 9
J'aime la fonction is.element:
is.element(a, T)