2017-02-21 3 views
1

Ich möchte 1000 Dateien mit 40 Zeilen und 20 Spalten zusammenfassen. Ich möchte zwei zusammenfassende Dateien erstellen, die jeweils die ursprüngliche Dimension 40x20 beibehalten. Erste Datei mit Mittelwert und zweite mit der Standardabweichung jeder Position in der Datei über alle 1000 Werte. Von diesem Post unten fand ich einen sehr eleganten Weg, um den Mittelwert über alle Dateien zu machen (danke @ Josliber), aber ich habe Mühe, diese Logik auf die Standardabweichung zu erweitern.Standardabweichung über mehrere CSV-Dateien in eine einzige Datei

Average multiple csv files into 1 averaged file in r

Ich bin in dem Punkt, dass ich meine Daten in einer Liste von Datenrahmen

csvs <- lapply(list.files(pattern="weather*.csv"), read.csv) 

und reduzierte hat gut funktioniert geladen meine mittlere Zusammenfassung Datei. Können wir etwas ähnliches (oder anders) machen, um meine Standardabweichungen zu erhalten?

Reduce("+", csvs)/length(csvs) 

Antwort

0

Sie könnten wieder eine ähnliche Sache tun, aber die grundlegende Mathematik hinter der Standardabweichung Berechnung verwenden:

# get the means as before 
means <- Reduce("+", csvs)/length(csvs) 

# make a new list of deviations from that known mean 
st.dev <- lapply(csvs, function(x) (x - means)^2) 

# use the list of deviations to calculate the standard deviation matrix 
st.dev <- sqrt(Reduce("+", st.dev)/length(st.dev)) 

Einzelheiten zu der Mathe hier, Suche Wikipedia für „Standardabweichung“.

+0

Dies ist wirklich nett, danke für die Statistiken zu überprüfen. Ich habe viel Sinn gemacht. – ecolog

1

Eine andere Option öffnet mehrere andere statistische Optionen.

Wenn Sie die Liste der 40x20 data.frames in ein 40x20x1000 Array konvertieren, können Sie apply über jedes der 40x20 "Rohre" in die dritte Dimension bohren.

eine Probe aus drei 2x4 Matrizen:

set.seed(42) 
lst <- lapply(1:3, function(ign) matrix(sample(8), nrow=2)) 
lst 
# [[1]] 
#  [,1] [,2] [,3] [,4] 
# [1,] 8 2 3 4 
# [2,] 7 5 6 1 
# [[2]] 
#  [,1] [,2] [,3] [,4] 
# [1,] 6 3 7 8 
# [2,] 5 4 1 2 
# [[3]] 
#  [,1] [,2] [,3] [,4] 
# [1,] 8 3 4 2 
# [2,] 1 6 7 5 

Verwenden der abind Bibliothek, können wir willkürlich entlang der dritten dim binden. (Dies ist, wo Sie beginnen würde, vorausgesetzt, dass Ihr data.frames werden in einer Liste bereits erfasst. abind funktioniert genauso gut mit gleich großen data.frames, wie es mit Matrizen der Fall ist.)

library(abind) 
ary <- abind(lst, along = 3) 
dim(ary) 
# [1] 2 4 3 

Und jetzt willkürlich laufen funktioniert entlang jeder "Röhre" (gegen "Zeile" oder "Spalte", wie die meisten zu apply für verwendet werden). Zum Beispiel, da die [1,1] Werte in den drei Schichten 8, 6 und 8, würden wir die folgenden Statistiken erwarten:

mean(c(8,6,8)) 
# [1] 7.333333 
sd(c(8,6,8)) 
# [1] 1.154701 

nun mit apply:

apply(ary, 1:2, mean) 
#   [,1]  [,2]  [,3]  [,4] 
# [1,] 7.333333 2.666667 4.666667 4.666667 
# [2,] 4.333333 5.000000 4.666667 2.666667 
apply(ary, 1:2, sd) 
#   [,1]  [,2]  [,3]  [,4] 
# [1,] 1.154701 0.5773503 2.081666 3.055050 
# [2,] 3.055050 1.0000000 3.214550 2.081666 

Dies eröffnet einige mehr statistische Aggregation Ihrer 1000 gleich großen data.frames unter der Annahme, dass der Index innerhalb jeder Schicht sinnvoll vergleichbar ist. Sie können vielleicht ein Arbeitsmodell entwickeln, um den Median oder ein anderes Perzentil mit Reduce zu bestimmen, aber es ist ziemlich einfach zu tun (sagen wir) apply(ary, 1:2, quantile, 0.9) für das 90. Perzentil.

+0

Vielen Dank für diese Lösung! – ecolog

Verwandte Themen