Comparações numéricas com NA os valores causando mau subconjuntos em R
-
21-12-2019 - |
Pergunta
Alguém pode me explicar o por que de avaliações lógicas que resolver ND produzir falsos linhas no vetor de comparação baseados em subconjuntos?Por exemplo:
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 comportamento inesperado, que é a forma preferencial para a contagem de funcionários fazendo mais de 100 mil no exemplo acima?
Solução
Primeiro de tudo, você provavelmente não quer cbind()
primeiro-o que irá forçar todas as suas variáveis de caráter.
emp_salary <- data.frame(employee,salary)
Duas soluções possíveis:
subset
exclui automaticamente os casos em que o critério éNA
:
nrow(subset(emp_salary,salary>1e5))
- contagem diretamente os resultados e usar
na.rm=TRUE
:
sum(salary>1e5,na.rm=TRUE)
Como para a lógica por trás do falso linhas:
bigsal <- salary>1e5
é uma lógica vetor que contémNA
s, como deve (porque não há nenhuma maneira de saber se umNA
valor satisfaz o critério ou não).- quando a indexação das linhas de um quadro de dados com uma lógica vetor contendo
NA
s, este é provavelmente o mais salientes pouco de documento (a partir dehelp("[")
):Quando a extração, numérico, lógico ou caractere 'NA' índice seleciona um elemento desconhecido e então retorna " ND " no elemento correspondente de uma lógica, inteiro, numérico, complexo de caractere ou de resultado, e 'NULL' para uma lista.
help("[.data.frame")
e não conseguia ver mais nada de útil.)
A única coisa a lembrar é que uma vez que a indexação está sendo feito, o R não tem qualquer conhecimento de que a lógica vetorial foi criado a partir do salary
a coluna, então não há nenhuma maneira para ele para fazer o que convém, que é a de manter os valores nas outras colunas.Aqui está uma maneira de pensar sobre o aparentemente estranho comportamento de preencher todas as colunas na NA
linha com NA
s:se R deixa a linha para fora inteiramente, que corresponderia ao critério a ser FALSE
.Se ele mantém-lo (e lembre-se de que ele não pode reter apenas algumas colunas e largue as outras) e, em seguida, que corresponderia ao critério a ser TRUE
.Se o critério não é nem FALSE
nem TRUE
, e , em seguida, é difícil ver o que outros comportamentos faz sentido ...