我想总结一下包含40行和20列的1000个文件。我想生成两个摘要文件,每个文件保留原始尺寸40x20。带有均值的第一个文件和带有所有1000个值的文件中每个位置的标准偏差的第二个文件。从下面的这篇文章中我发现了一种非常优雅的方法来对所有文件进行平均处理(感谢@josliber),但我正在努力将该逻辑扩展到标准偏差。
Average multiple csv files into 1 averaged file in r
我的意思是我将数据加载到数据帧列表中
csvs <- lapply(list.files(pattern="weather*.csv"), read.csv)
并且Reduced工作正常以获得我的平均摘要文件。我们可以做类似(或不同)的事情来获得我的标准偏差。
Reduce("+", csvs) / length(csvs)
答案 0 :(得分:1)
另一个选项打开了其他几个统计选项。
如果将40x20 data.frames列表转换为40x20x1000阵列,则可以{40}穿过每个40x20“管”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
用于)。例如,假设三层中的[1,1]
值分别为8,6和8,我们可以预期以下统计数据:
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个相同大小的data.frames打开更多的统计聚合。您可以设计一个工作模型来确定Reduce
的中位数或其他百分位数,但对于第90个百分位来说({)apply(ary, 1:2, quantile, 0.9)
很容易。
答案 1 :(得分: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 ) )
有关数学的详细信息,请在维基百科中搜索“标准偏差”。