2

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

4

1 回答 1

2

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

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

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

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

于 2014-06-03T17:01:06.413 回答