2013-01-05 19 views
8

Mi piacerebbe calcolare la media e la sd da un dataframe con una colonna per il parametro e una colonna per un identificatore di gruppo. Come posso calcolarli usando tapply? Potrei usare sd(v1, group, na.rm=TRUE), ma non posso adattare lo na.rm=TRUE all'istruzione quando si utilizza tapply. omit.na non è un'opzione. Ho un sacco di parametri e devo passare attraverso di essi passo dopo passo senza perdere metà del dataframe quando si escludono tutte le righe con un valore mancante.Come passare na.rm come argomento a tapply?

data("weightgain", package = "HSAUR") 
tapply(weightgain$weightgain, list(weightgain$source, weightgain$type), mean) 

Lo stesso vale per l'istruzione by.

x<-c(1,2,3,4,5,6,7,8,9,NA) 
y<-c(2,3,NA,3,4,NA,2,3,NA,2) 
group<-rep((factor(LETTERS[1:2])),5) 
df<-data.frame(x,y,group) 
df 

by(df$x,df$group,summary) 
by(df$x,df$group,mean) 

sd(df$x) #result: NA 
sd(df$x, na.rm=TRUE) #result: 2.738613 

Qualche idea su come ottenere questo risultato?

+0

Praticamente! Posso applicarlo a più colonne del tavolo o devo scorrere un elenco di parametri? 'tapply (df [c (" x "," y ")], df $ gruppo, sd, na.rm = TRUE)' o così? – Doc

+2

La domanda non ha senso. Con 'help (tapply)' dovresti vedere che c'è un argomento '...' che è descritto come una promessa che gli oggetti nominati saranno passati alla funzione FUN. Che errore hai ottenuto quando hai utilizzato il codice: 'tapply (df $ V1, df $ group, sd, na.rm = TRUE)' –

risposta

5

Penso che questo dovrebbe fare quello che vuoi.

  1. Selezionare le colonne che si desidera:

    v = c("x", "y")#or 
    v = colnames(df)[1:2] 
    
  2. Usa sapply di iterare v e passare i valori per tapply:

    sapply(v, function(i) tapply(df[[i]], df$group, sd, na.rm=TRUE)) 
    
13

sufficiente impostare na.rm=TRUE nel tapply funzione:

tapply(weightgain$weightgain, list(weightgain$source, weightgain$type), mean, na.rm=TRUE) 
+0

Questa dovrebbe essere la risposta accettata. – Ben

+0

Sono d'accordo. La risposta accettata sembra più complicata, e questa ha funzionato come un incantesimo. –

Problemi correlati