2010-07-27 16 views
6

Ich habe einen data.frame dieR: Gesamt Spalten einer data.frame

> head(df) 
      Memory Memory Memory Memory Memory  Naive  Naive 
10472501 6.075714 5.898929 6.644946 6.023901 6.332126 8.087944 7.520194 
10509163 6.168941 6.495393 5.951124 6.052527 6.404401 7.152890 8.335509 
10496091 10.125575 9.966211 10.075613 10.310952 10.090649 11.803949 11.274480 
10427035 6.644921 6.658567 6.569745 6.499243 6.990852 8.010784 7.798154 
10503695 8.379494 8.153917 8.246484 8.390747 8.346748 9.540236 9.091740 
10451763 10.986717 11.233819 10.643245 10.230697 10.541396 12.248487 11.823138 

wie folgt aussieht, und ich möchte den Mittelwert der Memory Säulen und den Mittelwert der Naive Spalten finden. Die Funktion aggregate aggregiert Zeilen. Diese data.frame könnte möglicherweise eine große Anzahl von Zeilen haben und somit zur Umsetzung dann aggregate durch die colnames des ursprünglichen data.frame scheint mir schlecht, und ist in der Regel ärgerlich Anwendung:

> head(t(aggregate(t(df),list(colnames(df)), mean))) 
     [,1]  [,2]  
Group.1 "Memory" "Naive" 
10472501 "6.195123" "8.125439" 
10509163 "6.214477" "7.733625" 
10496091 "10.11380" "11.55348" 
10427035 "6.672665" "8.266854" 
10503695 "8.303478" "9.340436" 

Was die blendend klar ist, was ich bin fehlt ?

+1

scharf Augen unter werden Sie feststellen, dass 8,12 ist nicht der Mittelwert von 8,08 und 7,52: es gibt ein paar mehr Spalten in Wirklichkeit. Aber nicht viel mehr! –

Antwort

8

ich ein großer Verfechter bin Daten der Neuformatierung so, dass es in einem „long“ -Format. Der Nutzen des langen Formats zeigt sich besonders bei Problemen wie diesem. Glücklicherweise ist es einfach, Daten mit dem reshape Paket in fast jedes Format umzuformen.

Wenn ich Ihre Frage richtig verstanden habe, wollen Sie den Mittelwert von Memory und Naive für jede Zeile. Aus irgendeinem Grund müssen wir die Spaltennamen für reshape::melt() eindeutig machen.

colnames(df) <- paste(colnames(df), 1:ncol(df), sep = "_") 

Dann erhalten Sie eine ID Spalte erstellen müssen. Sie könnten entweder tun

df$ID <- 1:nrow(df) 

oder, wenn diese rownames sinnvoll sind

df$ID <- rownames(df) 

Jetzt, mit dem reshape Paket

library(reshape) 
df.m <- melt(df, id = "ID") 
df.m <- cbind(df.m, colsplit(df.m$variable, split = "_", names = c("Measure", "N"))) 
df.agg <- cast(df.m, ID ~ Measure, fun = mean) 

df.agg jetzt wie Ihre gewünschte Ausgabe snippit aussehen sollte.

Oder, wenn Sie nur die Gesamtmittel über alle Zeilen wollen, wird Zacks Vorschlag funktionieren. So etwas wie

m <- colMeans(df) 
tapply(m, colnames(df), mean) 

Sie das gleiche Ergebnis konnte, aber formatiert als Datenrahmen mit

cast(df.m, .~variable, fun = mean) 
+0

Geben Jo die Zecke, weil dies der richtige Weg zu sein scheint, Dinge zu tun, so vielen Dank! Aber ja, wie John sagt, das Offensichtliche, was ich fehlte, war einfach die rowMeans Funktion, die etwas ist, ich werde nicht wieder vergessen! –

+0

Erm - schnelle Frage. Jede Idee, warum 's <- cast (df.m, ID ~ Variable, fun = var)' gebe ich eine Reihe von Nullen, wenn 'Spaß = mean' scheint in Ordnung und‚Spaß zu arbeiten = sum' auch funktioniert? Die Varianz dieser Spalten ist def nicht null. –

+0

Guter Fang! Ich weiß nicht, was das Geschäft war, aber da die Spaltennamen nicht eindeutig zuzuordnen waren, schmelzen sie nicht richtig. Ich habe meine Antwort so bearbeitet, dass sie jetzt funktionieren sollte! – JoFrhwld

0

Ich denke, Sie haben Ihre Daten ohne header=TRUE geladen und was Sie haben, ist eine Faktor-Matrix, und so schlägt Ihre im Allgemeinen gute Idee fehl.

3

Was ist so etwas wie

lapply(unique(colnames(df)), function(x) rowMeans(df[,colnames(df) == x])) 
+0

Danke Jonathan! Das war es, was ein Teil meines Gehirns mir sagte, dass ich existierte. Ich konnte mich einfach nicht daran erinnern. –

3

Jonathan Chang Antwort Um zu klären ... die blind offensichtliche Sache Sie fehlt ist, dass man nur Wählen Sie die Spalten aus und geben Sie den Befehl rowMeans aus. Das gibt Vektor der Mittel für jede Reihe. Sein Befehl erhält die Zeilenmittel für jede Gruppe von eindeutigen Spaltennamen und war genau das, was ich schreiben wollte. Mit Ihren Beispieldaten ergeben sich aus seinem Befehl zwei Listen.

rowMeans ist auch sehr schnell.

es zu brechen, ist

rowMeans(df[,colnames(df) == 'Memory']) #or from you example, rowMeans(df[,1:5]) 

Es ist einfach nur die Mittel, alle Ihre Speicherspalten zu erhalten ist die einfachste vollständige richtige Antwort, stimmen ihn und ihn richtig markieren, wenn es Ihnen gefällt.

(BTW, ich mochte auch Jo Empfehlung in der Regel Dinge wie lange Daten zu halten.)

0
m = matrix(1:12,3) 
colnames(m) = c(1,1,2,2) 

m 

    1 1 2 2 
[1,] 1 4 7 10 
[2,] 2 5 8 11 
[3,] 3 6 9 12 

mt = t(m) 
sapply(by(mt,rownames(mt),colMeans),identity) 

    1 2 
V1 2.5 8.5 
V2 3.5 9.5 
V3 4.5 10.5 
+0

Können Sie eine Erklärung geben? –

Verwandte Themen