有人可以向我解释为什么解决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
鉴于这种意外行为,在上述示例中,计算超过100K的员工的首选方法是什么?
答案 0 :(得分: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
是一个包含NA
s的逻辑向量,因为它必须(因为无法知道NA
值是否满足标准)。NA
s的逻辑向量索引数据帧的行时,这可能是文档中最突出的位(来自help("[")
):
提取时,数字,逻辑或字符'NA'索引选择一个未知元素,因此在逻辑,整数,数字,复数或字符结果的相应元素中返回'NA',并为列表返回'NULL'
help("[.data.frame")
并且看不到更有用的内容。)
要记住的是,一旦索引完成,R就不再知道逻辑向量是从salary
列创建的,所以没有办法让它做什么您可能想要的,即保留其他列中的值。这是考虑使用NA
s填充NA
行中所有列的看似奇怪的行为的一种方法:如果R完全离开行,那么这将符合标准是FALSE
。如果它保留它(并且记住它不能仅保留几列并删除其他列),那么这将符合TRUE
标准。如果标准既不是FALSE
也不是TRUE
,那么很难看出其他行为是否有意义......