我刚刚发现 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
对于所有实例。
注意
这个问题不是关于子集化和更改 NA
数据框中的值 - 我知道如何做到这一点( df[is.na(df)] <- "0"
)。这个问题是关于 is.na
的行为功能!为什么分配给 is.something
函数改变参数本身 - 这是意想不到的。
最佳答案
这里实际使用的函数不是 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
值与其他东西。
关于r - 为什么 is.na() 改变它的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42107628/