我刚刚发现了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
函数的赋值改变了参数本身 - 这是意料之外的。
答案 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<-`
将值设置为NA
,不将NA
值替换为其他值。