与NA值的数值比较导致R中出现错误子集
有人能给我解释一下为什么解析为NA的逻辑计算会在基于向量比较的子集中产生伪行吗?例如:与NA值的数值比较导致R中出现错误子集,r,comparison-operators,three-valued-logic,R,Comparison Operators,Three Valued Logic,有人能给我解释一下为什么解析为NA的逻辑计算会在基于向量比较的子集中产生伪行吗?例如: employee <- c("Big Shot CEO", "Programmer","Intern","Guy Who Got Fired Last Week") salary <- c( 10000000, 50000, 0, NA) emp_salary <- data.frame(employ
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
employee首先,您可能不想首先使用cbind()
,这将强制所有变量都使用字符
emp_salary <- data.frame(employee,salary)
- 直接计算结果并使用
na.rm=TRUE
:
至于假行背后的逻辑:
bigsal 1e5
是一个包含NA
s的逻辑向量,这是必须的(因为无法知道NA
值是否满足标准)
- 当使用包含
NA
s的逻辑向量对数据帧的行进行索引时,这可能是文档中最突出的部分(来自help(“[”
):
提取时,数字、逻辑或字符“NA”索引会选择未知元素,因此在逻辑、整数、数字、复数或字符结果的相应元素中返回“NA”,对于列表返回“NULL”
(我搜索了帮助(“[.data.frame”)
,没有找到更有用的东西。)
需要记住的是,一旦索引完成,R就不再知道逻辑向量是从salary
列创建的,因此它无法做您可能想做的事情,即保留其他列中的值。下面是一种思考填充的看似奇怪的行为的方法NA
行中带有NA
s的所有列:如果R完全保留该行,则对应的标准为FALSE
。如果保留该行(请记住,它不能仅保留少数列而删除其他列),那么这将对应于标准为TRUE
。如果标准既不是FALSE
也不是TRUE
,那么很难看出其他行为有什么意义…谢谢,我编辑了示例以删除cbind,但在比较中它是非强制的。在我的实际问题中,我没有使用cbind,刚刚合并了两个数据集。你能解释使用逻辑评估作为索引的问题吗?啊,这很有意义(以R的方式)。谢谢。FWIW我想这一次不是R的错。任何时候你开始尝试以一致的方式处理NA
s的逻辑,事情都可能变得奇怪。从R的角度很好地解释了事情看起来是什么样子。
nrow(subset(emp_salary,salary>1e5))
sum(salary>1e5,na.rm=TRUE)