为什么is.na()改变了它的论点?

时间:2017-02-08 08:01:07

标签: r

我刚刚发现了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函数的赋值改变了参数本身 - 这是意料之外的。

1 个答案:

答案 0 :(得分:14)

此处使用的实际函数不是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<-`将值设置为NANA值替换为其他值。