与NA值的数值比较导致R中出现错误子集

与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

有人能给我解释一下为什么解析为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

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)