何时使用na.omit vs complete.cases

时间:2015-04-06 13:46:35

标签: r

我有以下代码比较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

是否存在使用其中一种或有效的情况?

1 个答案:

答案 0 :(得分:11)

na.omit应用于对象的所有列(例如complete.cases)时,complete.casesdata.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这样可以更好地控制。