web-dev-qa-db-fra.com

Traiter avec VRAI, FAUX, NA et NaN

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 !

26
Remi.b

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!

11
ben

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
50
wjchulme

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)
6
Greg Snow

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
6
JWilliman

J'aime la fonction is.element:

is.element(a, T)
4
skeletor