2017-02-21 67 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

相关问题