`test [test $ A ==""," A"]`和`test $ A [test $ A ==""]之间的区别

时间:2014-07-09 10:32:16

标签: r dataframe

我一直认为他们是一样的,考虑一下:

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 == ""]以某种方式忽略NAtest[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 则允许(所以两个解释   会有相同的结果)

2 个答案:

答案 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 :-)