not - rstudio logical operators
R: Tratar con TRUE, FALSE, NA y NaN (5)
Aqui hay un vector
a = c(T,F,F,NA,F,T,NA,F,T)
Me gustaría una función simple que devuelva VERDADERO cada vez que haya un VERDADERO en a
y Falso cada vez que haya una Falso o una NA en a
.
Las 3 cosas siguientes no funcionan.
a == T
identical(T,a)
isTRUE(a)
Aquí hay una solución.
a[-which(is.na(a))]
Pero no parece ser una solución directa y sencilla.
¿Hay otra solución?
Aquí hay algunas funciones (y operadores) que conozco:
identical()
isTRUE()
is.na()
na.rm()
&
|
!
¿Cuáles son las otras funciones (operadores, consejos, lo que sea, ...) que son útiles para tratar con TRUE, FALSE, NA, NaN?
y finalmente...
¿Cuáles son las diferencias entre NA y NaN?
¿Hay otras "cosas lógicas" que T, F, NA y NaN?
Muchas gracias !
Así que quieres que TRUE permanezca VERDADERO y FALSO para que permanezca FALSO, el único cambio real es que NA debe convertirse en FALSO, así que haz este cambio como:
a[ is.na(a) ] <- FALSE
O puede reformular para decir que es VERDADERO si es VERDADERO y no falta:
a <- a & !is.na(a)
Me gusta la función is.element:
is.element(a, T)
No es necesario envolver nada en una función: los siguientes trabajos
a = c(T,F,NA)
a %in% TRUE
[1] TRUE FALSE FALSE
Para responder a sus preguntas en orden:
1) El operador ==
no trata las NA como usted esperaría. Una función muy útil es esta función r-cookbook.com 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 significa "No disponible" y no es lo mismo que el NaN general ("no es un número"). NA se usa generalmente para un valor predeterminado para que un número represente los datos faltantes; Los NaN normalmente se generan debido a un problema numérico (registro de -1 o similar).
3) No estoy realmente seguro de lo que quiere decir con "cosas lógicas": muchos tipos de datos diferentes, incluidos los vectores numéricos, se pueden usar como entrada para operadores lógicos. Puede intentar leer la página de operadores lógicos R: http://stat.ethz.ch/R-manual/R-patched/library/base/html/Logic.html .
¡Espero que esto ayude!
Si tomas la sugerencia de Ben Bolker arriba, puedes configurar tu propia función siguiendo la sintaxis de 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
Esto también funciona para la subcontratación de datos.
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
Y ayuda a evitar la incorporación accidental de filas vacías donde NA existe en los datos.
df[df$a == TRUE,]
a b
1 1 1
NA NA NA
6 1 6
NA.1 NA NA
9 1 9