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?

¿Fue útil?

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 es NA:

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 contiene NAs, como debe ser (porque no hay manera de saber si un NA 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 NAs, este es probablemente el más relevante poco de documento (de help("[")):

    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.

(He buscado 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 NAs: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 ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top