我一直认为他们是一样的,想想:
test <- data.frame(A = c(NA, ""), stringsAsFactors = F)
test[test$A == "", "A"]
## [1] NA ""
test$A[test$A == ""]
## [1] NA ""
class(test[test$A == "", "A"])
## [1] "character"
class(test$A[test$A == ""])
## [1] "character"到目前为止还不错,但是在做任务的时候
test[test$A == "", "A"] <- "Unknown" # Doesn't work
#Error in `[<-.data.frame`(`*tmp*`, test$A == "", "A", value = "Unknown") : missing values are not allowed in subscripted assignments of data frames
test$A[test$A == ""] <- "Unknown" # Works perfectlytest$A[test$A == ""]似乎以某种方式忽略了NA,而test[test$A == "", "A"]却无法这样做。
为了更好地说明这一点,如果我有一个仅包含NA的数据集,test$A[test$A == ""] <- "Unknown"仍然不会返回错误,只是不会更改任何内容:
test <- data.frame(A = NA, stringsAsFactors = F)
test$A[test$A == ""] <- "Unknown"
test
## A
## 1 <NA>从?"["文档来看,(如果我正确理解的话)它应该可以工作。
在替换(即在分配的lhs上使用索引)时,NA不选择要替换的任何元素。由于是否应该使用rhs的元素存在模糊性,因此只有当rhs值为1(因此这两种解释将具有相同的结果)时,才允许使用rhs值。
发布于 2014-07-09 12:02:59
我怀疑正在发生的事情与操作符优先级http://stat.ethz.ch/R-manual/R-patched/library/base/html/Syntax.html有关。$作为运算符先于[。
首先在第二示例中执行组件选择,然后对向量进行赋值。在第一个示例中,首先分配给一个data.frame。data.frame赋值方法有额外的检查,从而导致错误。
还有within an expression operators of equal precedence are evaluated from left to right except where indicated (注意,这=不一定是一个运算符)。
二进制运算符::、:::、$和@在右侧需要名称或字符串常量,而前两个操作符也要求它们位于左侧。所以,例如
> test[['A']][test$A == ""] <- "Unknown"
> test
A
1 <NA>
2 Unknown给出的结果与test$A[test$A == ""] <- "Unknown"相同,即使你、[[和[也有同样的优先权。
发布于 2014-07-09 11:00:24
正如你文章末尾的抄袭文本所暗示的那样,避免NAs b/o歧义(即使它有效,至少在任何情况下,这似乎很难理解和容易出错)。尝试显式地处理(排除) NAs,例如通过
test[(!is.na(test$A == "")) & (test$A == ""), "A"] <- "Unknown" # Does work :-)
https://stackoverflow.com/questions/24651298
复制相似问题