我刚刚发现了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别的东西值.