2015-04-06 13 views
5

Ho seguente codice confrontando na.omit e complete.cases:quando utilizzare na.omit contro 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 

ci sono delle situazioni in cui uno o l'altro dovrebbe essere utilizzato o efficacemente Sono i stesso?

+2

Presumibilmente se si desidera conservare informazioni sulle osservazioni omesse, ovvero cosa viene fornito nell'attributo 'na.action'. O il fatto che 'complete.cases' restituisca un vettore logico significa che potresti fare qualcosa come' mydf [complete.cases (mydf [, 1]),] 'se tu fossi interessato solo ai valori di' NA' nella prima colonna. – nrussell

+1

Due buone ragioni. Questa potrebbe essere una risposta piuttosto che un semplice commento. – rnso

+0

Grazie, e fatto. – nrussell

risposta

5

E 'vero che na.omit e complete.cases sono funzionalmente la stessa cosa quando complete.cases viene applicata a tutte le colonne del vostro oggetto (ad esempio data.frame):

R> all.equal(na.omit(mydf),mydf[complete.cases(mydf),],check.attributes=F) 
[1] TRUE 

Ma vedo due differenze fondamentali tra queste due funzioni (ci può molto bene essere differenze aggiuntive). Innanzitutto, na.omit aggiunge un attributo na.action all'oggetto, fornendo informazioni sul modo in cui i dati sono stati modificati. Immagino un caso d'uso banale per questo qualcosa come:

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. 

dove forniamo all'utente alcune informazioni rilevanti. Sono sicuro che una persona più creativa potrebbe (e probabilmente ha) trovato (trovato) usi migliori dell'attributo na.action, ma si ottiene il punto.

In secondo luogo, complete.cases consente di parziale la manipolazione dei valori mancanti, ad es.

R> mydf[complete.cases(mydf[,1]),] 
    AA BB 
1 2 2 
3 6 8 
4 5 NA 
5 9 6 

seconda di ciò che le variabili rappresentano, si può sentire valori imputando confortevoli per la colonna BB, ma non per la colonna AA, in modo da utilizzare complete.cases come questo si permette un controllo più preciso.

Problemi correlati