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?

Foi útil?

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ém NAs, como deve (porque não há nenhuma maneira de saber se um NA 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 NAs, este é provavelmente o mais salientes pouco de documento (a partir de help("[")):

    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.

(Eu procurei 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 NAs: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 ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top