Числовые сравнения со значениями NA, вызывающие плохие подмножества в R
-
21-12-2019 - |
Вопрос
Может ли кто-нибудь объяснить мне, почему логические вычисления, которые разрешают 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
представляет собой логический вектор, который содержитNA
s, как и должно быть (потому что нет способа узнать, является лиNA
значение удовлетворяет критерию или нет).- при индексировании строк фрейма данных логическим вектором, содержащим
NA
s, это, пожалуй, самый важный фрагмент документа (изhelp("[")
):При извлечении числовой, логический или символьный индекс «NA» выбирает неизвестный элемент и поэтому возвращает «NA» в соответствующем элементе логического, целочисленного, числового, комплексного или символьного результата и «NULL» для списка.
help("[.data.frame")
и не увидел ничего более полезного.)
Следует помнить, что после завершения индексации R больше не знает, что логический вектор был создан из salary
столбец, поэтому у него нет возможности сделать то, что вам нужно, а именно сохранить значения в других столбцах.Вот один из способов подумать о, казалось бы, странном поведении при заполнении всех столбцов в NA
грести с NA
с:если R полностью исключит строку, это будет соответствовать критерию FALSE
.Если он сохранит его (и помните, что он не может сохранить только несколько столбцов и удалить остальные), то это будет соответствовать критерию: TRUE
.Если критерий не является ни FALSE
ни TRUE
, тогда трудно понять, какое еще поведение имеет смысл...