2017-02-21 57 views
1

我想總結1000個40行20列的文件。我想生成兩個摘要文件,每個文件保留原始尺寸40x20。第一個文件帶有平均值,第二個帶有文件中每個位置在所有1000個值中的標準偏差。在下面的這篇文章中,我發現了一種非常優雅的方式來表達所有文件的意思(謝謝@josliber),但我努力將該邏輯擴展到標準偏差。跨多個csv文件的標準偏差到一個單一的文件

Average multiple csv files into 1 averaged file in r

我在我裝我的數據在dataframes

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

的名單,並減少了點工作得很好,讓我的平均摘要文件。我們可以做一些類似的(或不同的)來獲得我的標準偏差。

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

回答

0

你可以再次做類似的事情,但使用基本的數學標準偏差計算背後:

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

有關這裏的數學細節,搜索的「標準差」。

+0

這真的很整齊,感謝統計審查。我做了很多道理。 – ecolog

1

另一個選項打開了其他幾個統計選項。

如果您將40x20數據框的列表轉換爲40x20x1000數組,您可以將每個40x20「管」鑽到第3維的apply

使用三個的2x4矩陣的示例:

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 

使用abind文庫,我們可以任意地沿第三暗淡結合​​。 (在這裏,你會開始,給你的data.frames在列表中已捕獲。abind同樣適用與相同大小data.frames,因爲它與矩陣一樣。)

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

現在運行任意沿着每個「管」(相對於「行」或「列」,因爲大多數人認爲apply被用於)起作用。例如,在三層8,6和8,我們希望下面的統計數據給出的[1,1]值:

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

現在,使用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 

這開闢了更多一些假設每個圖層中的索引具有可比性,那麼您的1000個相同大小的數據幀的統計聚合。您可能可以設計一個工作模型來確定中位數或其他百分位數,但對於第90個百分位數,可以很容易地(比如說)apply(ary, 1:2, quantile, 0.9)

+0

非常感謝這個解決方案! – ecolog

相關問題