2010-02-15 4 views
8

Ho un frame di dati di 114 righe per 16 colonne in cui le righe sono individuali e le colonne sono o il loro nome o NA. Ad esempio, le prime 3 righe aspetto:Gestione dei valori NA applicabili e univoci

  name name.1  name.2 name.3  name.4 name.5  name.6 name.7  name.8 name.9  name.10 name.11  name.12 name.13  name.14 name.15 
1   <NA> <NA>  <NA> <NA>   <NA> <NA>   <NA> <NA>   <NA> <NA>  Aanestad <NA>  Aanestad <NA>  Aanestad <NA> 
2   <NA> <NA>  <NA> <NA>   <NA> <NA>   <NA> <NA>  Ackerman <NA>  Ackerman <NA>  Ackerman <NA>  Ackerman <NA> 
3   <NA> <NA>  <NA> <NA>   <NA> <NA>  Alarcon <NA>  Alarcon <NA>  Alarcon <NA>  Alarcon <NA>   <NA> <NA> 

voglio generare un elenco (se più nomi univoci per riga) o vettore (se solo un nome univoco per ogni riga) di tutti i nomi unici, con lunghezza 114.

Quando provo apply(x,1,unique) Ottengo un array 2xNcol dove a volte la prima cella di riga è NA ea volte la seconda cella di riga è NA.

[,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7] [,8] [,9]  
[1,] NA   NA   NA  NA  "Alquist" NA  "Ayala" NA  NA  
[2,] "Aanestad" "Ackerman" "Alarcon" "Alpert" NA  "Ashburn" NA  "Baca" "Battin" 

Quando quello che vorrei è solo:

Aanestad 
Ackerman 
Alarcon 
... 

io non riesco a capire come applicare unico(), ignorando NA. na.rm, na.omit ecc non sembrano funzionare. Mi sento come se mi mancasse qualcosa di molto semplice ...

Grazie!

risposta

18

unique non sembra avere un argomento na.rm, ma è possibile rimuovere i valori mancanti da soli prima di chiamare:

A <- matrix(c(NA,"A","A", 
      "B", NA, NA, 
       NA, NA, "C"), nr=3, byrow=TRUE) 
apply(A, 1, function(x)unique(x[!is.na(x)])) 

[1] "A" "B" "C" 
+0

Ahh ... questo funziona! Grazie! – bshor

8

eri molto, molto vicino nella vostra iniziale soluzione. Ma come ha osservato Aniko, non è necessario rimuovere i valori NA prima di poter utilizzare univoco.

Un esempio in cui abbiamo prima creare un simile data.frame e quindi utilizzare apply() come avete fatto - ma con una funzione anonima aggiuntiva che viene utilizzato per combinare na.omit() e unique():

R> DF <- t(data.frame(foo=sample(c(NA, "Foo"), 5, TRUE), 
         bar=sample(c(NA, "Bar"), 5, TRUE))) 
R> DF 
    [,1] [,2] [,3] [,4] [,5] 
foo "Foo" NA "Foo" "Foo" "Foo" 
bar NA NA NA "Bar" "Bar" 
R> apply(DF, 1, function(x) unique(na.omit(x))) 
    foo bar 
"Foo" "Bar" 
+0

Anche questo funziona alla grande. Grazie, Dirk (vai agli utenti di Chicago R!) – bshor