2015-11-18 9 views
5

Io uso il seguente data.frame come esempio:aggregata con na.action = na.pass dà risposta inaspettata

d <- data.frame(x=c(1,NA), y=c(2,3)) 

vorrei riassumere i valori di y dalla variabile x. Poiché non esiste un valore comune di x, mi aspetterei che l'aggregazione mi restituisca il dato originale.frame, dove NA è trattato come un gruppo. Ma l'aggregazione mi dà i seguenti risultati.

>aggregate(y ~ x, data=d, FUN=sum) 
    x y 
1 1 2 

ho letto la documentazione su come modificare le azioni predefinite di na.action, ma non sembra darmi qualcosa di significativo.

>aggregate(y ~ x, data=d, FUN=sum, na.action=na.pass) 
    x y 
1 1 2 

Cosa sta succedendo? Non riesco a capire cosa stia facendo na.pass in questo caso. C'è un'opzione per realizzare ciò che voglio in R? Qualsiasi aiuto sarebbe molto apprezzato.

+2

Stai dicendo che stai considerando un valore 'NA' come una variabile di raggruppamento? Vuoi il 'NA' o no? (Non è chiaro perché stai anche usando 'na.rm = TRUE' come parte del tuo test .... – A5C1D2H2I1M1N2O1R2T1

+0

Sì, voglio NA come gruppo – Sanias

+0

La documentazione dice" Righe con valori mancanti in uno dei le variabili verranno omesse dal risultato. "Se non lo vuoi, devi ricodificare la tua variabile' by' o usare una funzione diversa per l'aggregazione – Roland

risposta

7

aggregate fa uso di tapply, che a sua volta utilizza factor sulla sua variabile di raggruppamento.

Ma, un'occhiata a ciò che accade con NA valori in factor:

factor(c(1, 2, NA)) 
# [1] 1 2 <NA> 
# Levels: 1 2 

Annotare la levels. Si può fare uso di addNA per mantenere il NA:

addNA(factor(c(1, 2, NA))) 
# [1] 1 2 <NA> 
# Levels: 1 2 <NA> 

Così, si sarebbe probabilmente bisogno di fare qualcosa di simile:

aggregate(y ~ addNA(x), d, sum) 
# addNA(x) y 
# 1  1 2 
# 2  <NA> 3 

O qualcosa di simile:

d$x <- addNA(factor(d$x)) 
str(d) 
# 'data.frame': 2 obs. of 2 variables: 
# $ x: Factor w/ 2 levels "1",NA: 1 2 
# $ y: num 2 3 
aggregate(y ~ x, d, sum) 
#  x y 
# 1 1 2 
# 2 <NA> 3 

(In alternativa, effettua l'aggiornamento a qualcosa come "data.table", che non sarà solo più veloce n aggregate, ma offre anche un comportamento più coerente con i valori NA. Non c'è bisogno di prestare attenzione al fatto che tu sia using the formula method of aggregate or not.)

library(data.table) 
as.data.table(d)[, sum(y), by = x] 
#  x V1 
# 1: 1 2 
# 2: NA 3 
+0

Grazie, lo apprezzo.Sono curioso della funzionalità di na. pass. La documentazione dice che "restituisce l'oggetto invariato". Allora perché apparentemente vengono rimosse le NA? – Sanias

+0

@Sanias, che è in riferimento alle colonne che vengono aggregate, non alle colonne "by". – A5C1D2H2I1M1N2O1R2T1

Problemi correlati