Il y a quelques problèmes lorsque le vecteur logique contient des NA
valeurs.
Voir par exemple:
z <- c(TRUE, FALSE, NA)
sum(z) # gives you NA
table(z)["TRUE"] # gives you 1
length(z[z == TRUE]) # f3lix answer, gives you 2 (because NA indexing returns values)
Je pense donc que le plus sûr est d'utiliser na.rm = TRUE
:
sum(z, na.rm = TRUE) # best way to count TRUE values
(ce qui donne 1). Je pense que cette table
solution est moins efficace (regardez le code de table
fonction).
De plus, vous devez être prudent avec la solution "table", au cas où il n'y aurait pas de valeurs VRAIES dans le vecteur logique. Supposons z <- c(NA, FALSE, NA)
ou simplement z <- c(FALSE, FALSE)
, puis table(z)["TRUE"]
vous donne NA
pour les deux cas.
table(c(FALSE))["TRUE"]
donne NA, pas 0.sum(z, na.rm = TRUE)
Une autre option qui n'a pas été mentionnée est d'utiliser
which
:Juste pour donner un peu de contexte sur la question "qui est le plus rapide", il est toujours plus facile de se tester. J'ai agrandi le vecteur pour comparaison:
L'utilisation
sum
est donc clairement la meilleure approche dans ce cas. Vous pouvez également vérifier lesNA
valeurs comme Marek l'a suggéré.Juste pour ajouter une note concernant les valeurs NA et la
which
fonction:Notez ce qui ne vérifie que la logique
TRUE
, donc il ignore essentiellement les valeurs non logiques.la source
Une autre façon est
Bien que ce
sum(z)
soit beau et court, pour moi,length(z[z==TRUE])
c'est plus explicite. Cependant, je pense qu'avec une tâche simple comme celle-ci, cela ne fait pas vraiment de différence ...S'il s'agit d'un grand vecteur, vous devriez probablement opter pour la solution la plus rapide, à savoir
sum(z)
.length(z[z==TRUE])
est environ 10 fois plus lent ettable(z)[TRUE]
environ 200 fois plus lent quesum(z)
.En résumé,
sum(z)
c'est le plus rapide à taper et à exécuter.la source
which
est une bonne alternative, surtout lorsque vous opérez sur des matrices (vérifiez?which
et notez l'arr.ind
argument). Mais je suggère que vous vous en teniezsum
, à cause de l'na.rm
argument qui peut gérerNA
les dans un vecteur logique. Par exemple:Si vous tapez
sum(x)
vous obtiendrezNA
comme résultat, mais si vous passezna.rm = TRUE
ensum
fonction, vous obtiendrez le résultat que vous voulez.Votre question est-elle strictement théorique ou vous avez un problème pratique concernant les vecteurs logiques?
la source
Une autre option consiste à utiliser la fonction de résumé. Il donne un résumé des Ts, F et NA.
la source
summary(hival)["TRUE"]
:;J'ai fait quelque chose de similaire il y a quelques semaines. Voici une solution possible, c'est écrit à partir de zéro, donc c'est une sorte de version bêta ou quelque chose comme ça. Je vais essayer de l'améliorer en supprimant les boucles du code ...
L'idée principale est d'écrire une fonction qui prendra 2 (ou 3) arguments. Le premier est un
data.frame
qui contient les données recueillies à partir du questionnaire, et le second est un vecteur numérique avec des réponses correctes (cela n'est applicable que pour le questionnaire à choix unique). Vous pouvez également ajouter un troisième argument qui renverra un vecteur numérique avec le score final, ou data.frame avec un score intégré.Je vais essayer de le faire d'une manière plus élégante avec une fonction * ply. Remarquez que je n'ai pas
na.rm
argumenté ...Maintenant, appliquez une fonction:
Si vous passez l'argument data.frame, il renverra data.frame modifié. Je vais essayer de réparer celui-ci ... J'espère que cela aide!
la source
rowSums(t(t(d)==sol), na.rm=TRUE)
. Vecteur de recyclage R pour comparaison. Si vousd
étiez une matrice avec des cas dans des colonnes, cela se simplifie enrowSums(d==sol, na.rm=TRUE)
.J'ai juste eu un problème particulier où je devais compter le nombre de déclarations vraies à partir d'un vecteur logique et cela a fonctionné mieux pour moi ...
Cela prend donc un sous-ensemble de l'objet gene.rep.matrix, et applique un test logique, renvoyant un vecteur logique. Ce vecteur est mis comme argument à grep, qui renvoie les emplacements de toutes les entrées TRUE. Length calcule ensuite le nombre d'entrées que grep trouve, donnant ainsi le nombre d'entrées TRUE.
la source
Il existe également un package appelé
bit
qui est spécialement conçu pour les opérations booléennes rapides. C'est particulièrement utile si vous avez des vecteurs volumineux ou si vous devez effectuer de nombreuses opérations booléennes.la source