Comparaciones numéricas con valores de NA causando mala subconjuntos de R
-
21-12-2019 - |
Pregunta
Puede alguien explicarme por qué evaluaciones lógicas que resolver a NA producir falsos filas en el vector de comparación basado en subconjuntos?Por ejemplo:
employee <- c("Big Shot CEO", "Programmer","Intern","Guy Who Got Fired Last Week")
salary <- c( 10000000, 50000, 0, NA)
emp_salary <- data.frame(employee,salary)
# how many employees paid over 100K?
nrow(emp_salary[salary>100000,]) # Returns 2 instead of 1 -- why?
emp_salary[salary>100000,]
# returns a bogus row of all NA's (not "Guy Who Got Fired")
# employee salary
# 1 Big Shot CEO 1e+07
# NA <NA> <NA>
salary[salary>100000]
# returns:
# [1] 1e+07 NA
NA > 100000 #returns NA
Dado este comportamiento inesperado, ¿cuál es la mejor manera de recuento de empleados que ganan más de 100 mil en el ejemplo anterior?
Solución
Primero de todos, usted probablemente no quiere cbind()
primero, que seducirá a todas las variables de carácter.
emp_salary <- data.frame(employee,salary)
Dos posibles soluciones:
subset
excluye automáticamente de los casos donde el criterio esNA
:
nrow(subset(emp_salary,salary>1e5))
- el recuento de los resultados directamente y uso
na.rm=TRUE
:
sum(salary>1e5,na.rm=TRUE)
Como para la lógica detrás de la falsa filas:
bigsal <- salary>1e5
es una lógica vector que contieneNA
s, como debe ser (porque no hay manera de saber si unNA
valor satisface el criterio o no).- cuando la indexación de las filas de una trama de datos con una lógica vector que contiene
NA
s, este es probablemente el más relevante poco de documento (dehelp("[")
):Cuando la extracción, numérico, lógico o el carácter 'NA' índice recoge una incógnita y lo devuelve 'de NA' en el elemento correspondiente de una manera lógica, integer, numeric, complejo o el carácter de resultado, y 'NULL' para una lista.
help("[.data.frame")
y no podía ver nada más útil.)
La cosa a recordar es que una vez que la indexación se realiza, R que no tiene conocimiento de que la lógica vector fue creado a partir de la salary
la columna, de modo que no hay manera de hacer lo que usted podría desear, que es conservar los valores en las otras columnas.Aquí está una manera de pensar acerca de lo aparentemente extraño comportamiento de llenar todas las columnas de la NA
fila con NA
s:si R sale de la fila en su totalidad, que se corresponden con el criterio de FALSE
.Si se mantiene (y recuerde que no puede retener sólo un par de columnas y la caída de los otros), a continuación, que corresponden al criterio de TRUE
.Si el criterio no es ni FALSE
ni TRUE
, entonces es difícil ver qué otro tipo de conducta que tiene sentido ...