【问题标题】:Numeric comparisons with NA values causing bad subsets in R与 NA 值的数值比较导致 R 中的错​​误子集
【发布时间】:2014-06-03 16:54:57
【问题描述】:

有人可以向我解释为什么解析为 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 万的员工的首选方法是什么?

【问题讨论】:

    标签: r comparison-operators three-valued-logic


    【解决方案1】:

    首先,您可能不想先 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 &lt;- salary&gt;1e5 是一个逻辑向量,其中包含 NAs,这是必须的(因为无法知道 NA 值是否满足标准)。
    • 当使用包含NAs 的逻辑向量索引数据帧的行时,这可能是文档中最显着的位(来自help("[")):

      提取时,数字、逻辑或字符“NA”索引会选择未知元素,因此在逻辑、整数、数字、复数或字符结果的相应元素中返回“NA”,对于列表返回“NULL” .

    (我搜索了help("[.data.frame") 并没有看到任何更有用的东西。)

    要记住的是,一旦完成索引,R 就不再知道逻辑向量是从 salary 列创建的,因此它无法执行您可能想要的操作,即保留其他列中的值。这是考虑用NAs 填充NA 行中所有列的看似奇怪行为的一种方法:如果R 完全不考虑该行,则对应于FALSE 的标准。如果它保留它(并记住它不能只保留几列并删除其他列),那么这将对应于TRUE 的标准。如果标准既不是FALSE 也不是TRUE,那么很难看出还有什么行为是有意义的......

    【讨论】:

    • 谢谢,我编辑了示例以删除 cbind,但无论如何它在比较中变得不强制了。在我的实际问题中,我没有使用 cbind,只是合并了两个数据集。你能解释使用逻辑评估作为索引的问题吗?
    • 啊,这是有道理的(以 R 的方式)。谢谢。
    • FWIW 我认为这次不是 R 的错。每当您开始尝试以一致的方式处理 NAs 的逻辑时,事情都可能变得很奇怪。
    • “从 R 的角度”很好地解释了事物的样子。
    猜你喜欢
    • 2012-12-25
    • 2014-04-25
    • 1970-01-01
    • 2019-12-27
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多