我一直认为他们是一样的,考虑一下:
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 perfectly
似乎test$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 则允许(所以两个解释 会有相同的结果)
答案 0 :(得分:2)
我怀疑发生的事情与运营商优先级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"
和[[
具有相同的优先级,也会得到与[
相同的结果。
答案 1 :(得分:0)
由于帖子末尾的复制文本已经建议,因此避免NAs b / o歧义(即使它有效,这似乎至少难以理解且容易出错),因为索引&#34;在任何情况下。尝试明确处理(排除)NAs,例如由
test[(!is.na(test$A == "")) & (test$A == ""), "A"] <- "Unknown" # Does work :-)