与 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
鉴于这种意外行为,在上面的示例中计算收入超过 10 万的员工的首选方法是什么?
解决方案
首先,你可能不想 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
s:如果 R 将该行完全排除,则对应的标准是 FALSE
. 。如果它保留它(并记住它不能只保留几列并删除其他列),那么这将对应于标准 TRUE
. 。如果标准两者都不是 FALSE
也不 TRUE
, ,那么很难看出其他行为有什么意义......
不隶属于 StackOverflow