Hay algunos problemas cuando el vector lógico contiene NA
valores.
Ver por ejemplo:
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)
Entonces creo que lo más seguro es usar na.rm = TRUE
:
sum(z, na.rm = TRUE) # best way to count TRUE values
(que da 1). Creo que esa table
solución es menos eficiente (mira el código de table
función).
Además, debe tener cuidado con la solución de "tabla", en caso de que no haya valores VERDADEROS en el vector lógico. Supongamos z <- c(NA, FALSE, NA)
o simplemente z <- c(FALSE, FALSE)
, luego table(z)["TRUE"]
te da NA
para ambos casos.
table(c(FALSE))["TRUE"]
da NA, no 0.sum(z, na.rm = TRUE)
Otra opción que no se ha mencionado es usar
which
:Solo para proporcionar algo de contexto sobre la "pregunta más rápida", siempre es más fácil ponerse a prueba. Hice el vector mucho más grande para comparar:
Claramente, usar
sum
es el mejor enfoque en este caso. También es posible que desee verificar losNA
valores como sugirió Marek.Solo para agregar una nota sobre los valores de NA y la
which
función:Tenga en cuenta que lo que solo busca es lógico
TRUE
, por lo que esencialmente ignora los valores no lógicos.fuente
Otra forma es
Si bien
sum(z)
es agradable y breve, para mílength(z[z==TRUE])
es más autoexplicativo. Sin embargo, creo que con una tarea simple como esta realmente no hace la diferencia ...Si es un vector grande, probablemente deberías elegir la solución más rápida, que es
sum(z)
.length(z[z==TRUE])
es aproximadamente 10 veces más lento ytable(z)[TRUE]
es aproximadamente 200 veces más lento quesum(z)
.En resumen,
sum(z)
es el más rápido para escribir y ejecutar.fuente
which
es una buena alternativa, especialmente cuando opera en matrices (verifique?which
y observe elarr.ind
argumento). Pero le sugiero que se quedesum
, debido a unna.rm
argumento que puede manejarNA
's en vector lógico. Por ejemplo:Si escribe en el
sum(x)
que obtendráNA
como resultado, pero si pasana.rm = TRUE
ensum
la función, obtendrá el resultado que desea.¿Es su pregunta estrictamente teórica o tiene algún problema práctico con respecto a los vectores lógicos?
fuente
Otra opción es usar la función de resumen. Da un resumen de los Ts, Fs y NAs.
fuente
summary(hival)["TRUE"]
:;He estado haciendo algo similar hace unas semanas. Aquí hay una posible solución, está escrita desde cero, por lo que es una especie de versión beta o algo así. Intentaré mejorarlo eliminando bucles del código ...
La idea principal es escribir una función que tome 2 (o 3) argumentos. El primero es el
data.frame
que contiene los datos recopilados del cuestionario, y el segundo es un vector numérico con respuestas correctas (esto solo es aplicable para el cuestionario de opción única). Alternativamente, puede agregar un tercer argumento que devolverá un vector numérico con puntaje final o data.frame con puntaje incrustado.Intentaré hacer esto de una manera más elegante con alguna función * pliegue. Tenga en cuenta que no puse
na.rm
argumento ... Hará esoAhora aplique una función:
Si pasa el argumento data.frame, devolverá data.frame modificado. Trataré de arreglar esto ... ¡Espero que ayude!
fuente
rowSums(t(t(d)==sol), na.rm=TRUE)
. R recicla el vector para comparar. Si sud
matriz fuera con casos en columnas, entonces se simplifica arowSums(d==sol, na.rm=TRUE)
.Acabo de tener un problema particular en el que tuve que contar el número de declaraciones verdaderas de un vector lógico y esto funcionó mejor para mí ...
Entonces, esto toma un subconjunto del objeto gene.rep.matrix y aplica una prueba lógica, devolviendo un vector lógico. Este vector se pone como argumento para grep, que devuelve las ubicaciones de las entradas VERDADERAS. La longitud luego calcula cuántas entradas encuentra grep, dando así el número de entradas VERDADERAS.
fuente
También hay un paquete llamado
bit
que está diseñado específicamente para operaciones booleanas rápidas. Es especialmente útil si tiene vectores grandes o necesita realizar muchas operaciones booleanas.fuente