我有以下代码比较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
是否存在使用其中一种或有效的情况?
答案 0 :(得分:11)
当na.omit
应用于对象的所有列(例如complete.cases
)时,complete.cases
和data.frame
确实在功能上相同:
R> all.equal(na.omit(mydf),mydf[complete.cases(mydf),],check.attributes=F)
[1] TRUE
但我发现这两个功能之间存在两个根本区别(可能还有其他差异)。首先,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.
我们向用户提供一些相关信息。我确信一个更有创造力的人可以(并且可能已经)找到(找到)na.action
属性的更好用法,但是你明白了。
其次,complete.cases
允许部分操纵缺失值,例如
R> mydf[complete.cases(mydf[,1]),]
AA BB
1 2 2
3 6 8
4 5 NA
5 9 6
根据您的变量所代表的内容,您可能会觉得列BB
列的值不合适,但列AA
的值不合适,因此使用complete.cases
这样可以更好地控制。