2013-11-29 3 views
5

Ich möchte den Mittelwert über einen Datenrahmen von Werten finden. Zum Beispiel, wenn ich folgende Daten habe:Durchschnitt der Werte in Spalten im Dataframe?

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

Und ich möchte den Mittelwert aller Werte mit dem Status A darin finden. Wie würde ich das tun?

Hier ist mein Versuch:

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

Aber ich halte einen Fehler erhalten, die Error: attempt to apply non-function sagt. Kann mir jemand helfen? Vielen Dank!

Antwort

12

Wenn ich Ihre Anforderung klar zu verstehen, sollte folgendes Ihre Anforderung erfüllen:

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 mit 'with' ohne zu viele' $ 's in Thesen Fällen deutlicher macht:' mit (df, Mittelwert (val [sta == "A"])) ' – Arun

+1

und noch lesbarer (diskutierbar) kann sein: 'mit (Teilmenge (df, sta ==" A "), mittel (val))' – flodel

3

Denken Sie daran, dass () für Funktionsaufrufe verwendet wird, [] werden für das Subsetting verwendet. Sie rufen jetzt eine Funktion auf, obwohl tatsächlich keine Funktion vorhanden ist, und geben die angezeigte Fehlermeldung an.

In einem allgemeineren Sinne, für diese Art von Dingen mag ich plyr verwenden, obwohl data.table eine tolle andere Option ist.

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

Dies ergeben Sie einen neuen data.frame mit den Mittelwerten von Value für jeden eindeutigen Wert von Status.

3

Als @PaulHiemstra zu, erwähnt gibt es eine saubere Lösung, die data.table wäre:

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

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


oder Sie können den Schlüssel für schnellere Ergebnisse:

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)]