2016-04-19 11 views
2

Sehr einfache Frage hier! Auf einem 10 x 2-Datenrahmen möchte ich den Durchschnitt jeder Spalte berechnen und das Ergebnis in eine neue 1 x 2-Matrix setzen.Der effizienteste Weg, eine Matrix von Durchschnittswerten zu erstellen

colmeans berechnet die Durchschnittswerte, platziert das Ergebnis jedoch in einem 2 x 1-Vektor. Beim Versuch, den Vektor zu transponieren, erscheint die Fehlermeldung "Fehler beim Transponieren (AverageX): l muss eine Liste sein."

Als Workaround erstellte ich eine leere 1 x 2-Matrix (gefüllt mit NAs), dann verwendete rbind, um den Mittelwertvektor mit der leeren Matrix zusammenzuführen, und löschte dann die NAs.

Es funktioniert, aber ich wette, könnte das gleiche mit zwei Zeilen Code statt vier tun. Hätte jemand einen besseren Weg, dies zu erreichen? Vielen Dank für die Hilfe.

df <- data.frame(Price = c(1219, 1218, 1220, 1216, 1217, 1218, 1218, 1207, 1206, 1205), XXX = c(1218, 1218, 1219, 1218, 1221, 1217 , 1217, 1216, 1219, 1216)) 

Average <- colMeans(df, na.rm = TRUE) #result is a vector => turn it into a 1xm matrix 
AverageMatrix <- matrix(nrow = 1, ncol = 2) 
AverageMatrix <- rbind(AverageMatrix, Average) 
AverageMatrix<- AverageMatrix[-1, , drop = FALSE] 

EDIT: @akrun eine Matrix von Mittelwert zu schaffen und für jede Spalte einer Matrix sind ähnlich technisch noch andere Probleme mit einem durchschnittlichen erstellen, daher meiner Meinung nach ist dies kein Duplikat. Die Frage drückt aus, dass ich bereits wusste, wie man einen Durchschnitt für jede Spalte einer Matrix berechnet, und dass ich eine effizientere Möglichkeit suchte, dieses Ergebnis als Matrix zu speichern, ein einfaches Problem, das in der anderen Frage nicht behandelt wird.

+0

Matrix (Durchschnitt, nrow = 1, ncol = 2)? –

+0

Oder 'Matrix (colmeans (df), 1, 2)'. Beachten Sie, dass Vektoren keine Dimension in R haben. – lmo

+0

'Average <- t (t (colMeans (df, na. rm = TRUE))) '? –

Antwort

3

Sie eine benannte Matrix der Spaltenmittel einfach durch die Umsetzung des Ergebnisses aus colMeans(), weil (von bekommen help(t))

Wenn x ein Vektor ist, wird es als eine Spalte behandelt, dh das Ergebnis ist eine 1-Zeilen-Matrix.

t(colMeans(df, na.rm = TRUE)) 
#  Price XXX 
# [1,] 1214.4 1217.9 
1

Ich benutze dplyr für solche Sachen. Mit dplyr können Sie:

df <- data.frame(Price = c(1219, 1218, 1220, 1216, 1217, 1218, 1218, 1207, 1206, 1205), XXX = c(1218, 1218, 1219, 1218, 1221, 1217 , 1217, 1216, 1219, 1216)) 

library(dplyr) 
res <- df %>% summarize(mean(Price), mean(XXX)) 
res 
# mean(Price) mean(XXX) 
#1  1214.4 1217.9 

Edit: Ich habe vergessen Sie es als eine Matrix wollte:

res <- df %>% summarize(mean(Price), mean(XXX)) %>% as.matrix 
+0

Vielen Dank AllanT. Bevorzugen Sie die Spalten, um die Namen nicht zu ändern, und wenden Sie diese auf hunderte von Spalten an. Daher wird eine der anderen Antworten verwendet. Sehr nützlich, trotzdem .. – Krug

2

Mit data.table, wir können die Spalten durchlaufen und den mean erhalten (nach dem 'data.frame' auf 'data.table' Umwandlung (setDT(df))

library(data.table) 
setDT(df)[, lapply(.SD, mean, na.rm=TRUE)] 
# Price XXX 
#1: 1214.4 1217.9 
Verwandte Themen