我有以下代码比较na.omit和complete.cases:
> mydf
AA BB
1 2 2
2 NA 5
3 6 8
4 5 NA
5 9 6
6 NA 1
>
>
> na.omit(mydf)
AA BB
1 2 2
3 6 8
5 9 6
>
> mydf[complete.cases(mydf),]
AA BB
1 2 2
3 6 8
5 9 6
>
> str(na.omit(mydf))
'data.frame': 3 obs. of 2 variables:
$ AA: int 2 6 9
$ BB: int 2 8 6
- attr(*, "na.action")=Class 'omit' Named int [1:3] 2 4 6
.. ..- attr(*, "names")= chr [1:3] "2" "4" "6"
>
>
> str(mydf[complete.cases(mydf),])
'data.frame': 3 obs. of 2 variables:
$ AA: int 2 6 9
$ BB: int 2 8 6
>
> identical(na.omit(mydf), mydf[complete.cases(mydf),])
[1] FALSE
Run Code Online (Sandbox Code Playgroud)
是否有任何情况应该使用其中一个或有效它们是相同的?
nru*_*ell 13
这是事实,na.omit而且complete.cases当在功能上是相同的complete.cases应用到你的对象的所有列(如data.frame):
R> all.equal(na.omit(mydf),mydf[complete.cases(mydf),],check.attributes=F)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)
但我发现这两个函数之间存在两个根本区别(可能存在其他差异).首先,向对象na.omit添加na.action属性,提供有关如何修改数据WRT缺失值的信息.我想象一个简单的用例如下:
foo <- function(data) {
data <- na.omit(data)
n <- length(attributes(na.omit(data))$row.names)
message(sprintf("Note: %i rows removed due to missing values.",n))
# do something with data
}
##
R> foo(mydf)
Note: 3 rows removed due to missing values.
Run Code Online (Sandbox Code Playgroud)
我们为用户提供一些相关信息.我相信一个更有创造力的人可以(并且可能已经)找到(找到)该na.action属性的更好用途,但是你明白了.
其次,complete.cases允许部分操纵缺失值,例如
R> mydf[complete.cases(mydf[,1]),]
AA BB
1 2 2
3 6 8
4 5 NA
5 9 6
Run Code Online (Sandbox Code Playgroud)
根据您的变量所代表的内容,您可能会感觉很舒服地为列输入值BB,但不能为列进行输入AA,因此使用complete.cases这样可以更精细地控制.