2015-04-06 62 views
5

我有下面的代碼比較na.omit和complete.cases:時使用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 

是否有其中一方或另一方應使用任何情況或有效它們是相同?

+2

想必如果您想保留有關省略觀察的信息,即「na.action」屬性中給出的內容。或者'complete.cases'返回一個邏輯向量的事實意味着如果您只關心第一列中的NA值,您可以像'mydf [complete.cases(mydf [,1]),]''做類似的事情。 – nrussell 2015-04-06 13:59:24

+1

兩個很好的理由。這可能是一個答案,而不僅僅是一個評論。 – rnso 2015-04-06 14:52:07

+0

謝謝,完成了。 – nrussell 2015-04-06 15:30:33

回答

5

這是真的,當complete.cases應用到你的對象的所有列na.omitcomplete.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這樣可以讓你更好的控制。

相關問題