2013-11-29 7 views
5

Voglio trovare la media attraverso un dataframe di valori. Ad esempio, se ho i seguenti dati:Media dei valori nelle colonne nel dataframe?

ID Value Status 
1 10  A 
2 15  B 
3 20  A 

E voglio trovare la media di tutti i valori con lo stato A in esso. Come lo farei?

Ecco il mio tentativo:

dataframe$balance.mean(dataframe$status == 'A') 

Ma io continuo a ricevere un errore che dice Error: attempt to apply non-function. Qualcuno mi può aiutare? Grazie!

risposta

12

Se ho capito la vostra esigenza in modo chiaro, in seguito dovrebbe soddisfare le vostre esigenze:

id<-c(1,2,3) 
val<-c(10,15,20) 
sta<-c("A","B","A") 

df<-data.frame(id,val,sta) 

mean(df$val[df$sta=="A"]) 
+2

+1, usando 'with' rende più chiaro nella tesi casi senza troppi' $ 's:' con (df, media (val [STA == "A"])) ' – Arun

+1

e ancor più leggibile (discutibile) può essere: 'with (sottoinsieme (df, sta ==" A "), mean (val))' – flodel

3

Ricordare che () viene utilizzato per le chiamate di funzione, [] vengono utilizzati per il subset. Ora stai chiamando una funzione mentre in realtà non c'è alcuna funzione, dando il messaggio di errore che vedi.

In un senso più generale, per questo tipo di cose mi piace usare plyr, anche se data.table è un'altra fantastica opzione.

library(plyr) 
ddply(dataframe, .(Status), summarize, mean_value = mean(Value)) 

Questo produrrà una nuova data.frame con i valori medi di Value per ogni valore unico di Status.

3

Come @PaulHiemstra accennato, v'è una soluzione pulita data.table che sarebbe:

library(data.table) 
DT[Status=="A", mean(val)] 

dove DT <- as.data.table(your_data_frame)


oppure è possibile impostare la chiave per risultati più rapidi:

setkey(DT, "status") 
# this will produce a data.table, not a single 
DT["A", mean(val)] 
# This produces a single number 
DT["A"] [, mean(val)]