问题 为什么is.na()会改变它的论点?


我刚刚发现了以下行为 is.na() 我不明白的功能:

df <- data.frame(a = 5:1, b = "text")
df
##   a    b
## 1 5 text
## 2 4 text
## 3 3 text
## 4 2 text
## 5 1 text
is.na(df)
##          a     b
## [1,] FALSE FALSE
## [2,] FALSE FALSE
## [3,] FALSE FALSE
## [4,] FALSE FALSE
## [5,] FALSE FALSE
is.na(df) <- "0"
df
##   a    b  0
## 1 5 text NA
## 2 4 text NA
## 3 3 text NA
## 4 2 text NA
## 5 1 text NA

我的问题
为什么 is.na() 更改其参数(在这种情况下,向数据框添加一个额外的列)?在这种情况下,它的行为似乎是令人费解的(或至少是意外的),因为查询的结果是 FALSE 对于所有情况。

NB
这个问题不是关于子集化和改变 NA 数据框中的值 - 我知道如何做到(df[is.na(df)] <- "0")。这个问题是关于的行为 is.na 功能!为什么要分配到 is.something 函数改变参数本身 - 这是意料之外的。


5276
2018-02-08 08:01


起源

您需要使用这些逻辑变量作为索引引用,即 df[is.na(df)] <- 0 - Sotos
@Sotos:请看我的评论。 - vonjd
@vonjd我看到了你的评论,但我的观点是,即使有NA值,你的作业也不起作用,即 df$a[3] <- NA; is.na(df) <- "0" - akrun
@akrun:我知道,但为什么是 is.something 改变论证本身 - 这是意料之外的,不是吗? - vonjd
is.na<- 和 is.na 功能不一样。 - David Arenburg


答案:


这里使用的实际功能不是 is.na() 但是赋值功能 `is.na<-`,默认方法是 `is.na<-.default`。打印功能到控制台,我们看到:

function (x, value) 
{
    x[value] <- NA
    x
}

很清楚, value 应该是这里的索引。如果你索引一个 data.frame 喜欢 df["0"],它会尝试选择名为的列 "0"。如果你 分配 什么东西 df["0"],该列将被创建并填充(在这种情况下) NA

澄清, `is.na<-` 将值设置为 NA它确实如此  更换 NA 价值与其他东西。


14
2018-02-08 08:13



谢谢,所以我错过的一点就是在这种情况下分配给 is.na 其实 套 价值观 NA。我会 决不 认为这是可能的。 - vonjd
它有记录,但也许有点令人惊讶,是的。 - Axeman
这与rownames()和colnames()的工作方式完全相同,就像其他示例一样。这些都可以得到和设定。它实际上是非常一致的语法。 - Elin