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

von*_*njd 11 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
Run Code Online (Sandbox Code Playgroud)

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

注意:
这个问题不是关于NA数据框中的子集和更改值 - 我知道如何做到这一点(df[is.na(df)] <- "0").这个问题是关于is.na函数的行为!为什么赋值is.something函数会改变参数本身 - 这是意料之外的.

Axe*_*man 14

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

function (x, value) 
{
    x[value] <- NA
    x
}
Run Code Online (Sandbox Code Playgroud)

很明显,value这应该是一个索引.如果您索引data.frame类似df["0"],它将尝试选择名为的列"0".如果您指定了某些内容df["0"],则将创建并填充该列(在本例中)NA.

为了澄清,`is.na<-`设置值NA,但它不会取代NA别的东西值.

  • 有记录,但也许有点令人惊讶,是的. (2认同)