Числовые сравнения со значениями NA, вызывающие плохие подмножества в R

StackOverflow https://stackoverflow.com//questions/24020784

Вопрос

Может ли кто-нибудь объяснить мне, почему логические вычисления, которые разрешают NA, создают фиктивные строки в подмножествах, основанных на векторном сравнении?Например:

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

Учитывая такое неожиданное поведение, как лучше всего подсчитать сотрудников, зарабатывающих более 100 тысяч в приведенном выше примере?

Это было полезно?

Решение

Прежде всего, вы, вероятно, не хотите cbind() во-первых - это приведет все ваши переменные к символу.

 emp_salary <- data.frame(employee,salary)

Два возможных решения:

  • subset автоматически исключает случаи, когда критерий NA:

nrow(subset(emp_salary,salary>1e5))
  • подсчитайте результаты напрямую и используйте na.rm=TRUE:

sum(salary>1e5,na.rm=TRUE)

Что касается логики фиктивных строк:

  • bigsal <- salary>1e5 представляет собой логический вектор, который содержит NAs, как и должно быть (потому что нет способа узнать, является ли NA значение удовлетворяет критерию или нет).
  • при индексировании строк фрейма данных логическим вектором, содержащим NAs, это, пожалуй, самый важный фрагмент документа (из help("[")):

    При извлечении числовой, логический или символьный индекс «NA» выбирает неизвестный элемент и поэтому возвращает «NA» в соответствующем элементе логического, целочисленного, числового, комплексного или символьного результата и «NULL» для списка.

(Я искал help("[.data.frame") и не увидел ничего более полезного.)

Следует помнить, что после завершения индексации R больше не знает, что логический вектор был создан из salary столбец, поэтому у него нет возможности сделать то, что вам нужно, а именно сохранить значения в других столбцах.Вот один из способов подумать о, казалось бы, странном поведении при заполнении всех столбцов в NA грести с NAс:если R полностью исключит строку, это будет соответствовать критерию FALSE.Если он сохранит его (и помните, что он не может сохранить только несколько столбцов и удалить остальные), то это будет соответствовать критерию: TRUE.Если критерий не является ни FALSE ни TRUE, тогда трудно понять, какое еще поведение имеет смысл...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top