[英]Marginal summaries of three-dimensional array
我正在使用以“ R转储”格式输出数据的系统。 例如,它可能会输出一个三维数组,如下所示:
obs <- structure(c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24),
.Dim=c(2,4,3))
我是R的新手,但我想使用R来检查此数据的边际摘要。 例如,我想查看一个2x4的平均值表,该平均值在第三个维度上平均。
(如果可能的话,我还希望看到边际汇总分解为一个维度,例如一行4个平均值,每个平均值都占我数据的2x3切片。)
我尝试了summary(obs)
,它折叠了所有维度并给出了总体统计信息,而sapply(obs, summary)
则不折叠任何维度,仅给出了每个单独基准的“摘要”。
我希望有一个我想要的功能,但我找不到它!
为此apply
作品:
apply(obs,1:2,mean)
[,1] [,2] [,3] [,4]
[1,] 9 11 13 15
[2,] 10 12 14 16
要么
aperm(apply(obs,1:2,summary),c(1,3,2))
(或apply(obs,2:1,summary)
注释中指出的apply(obs,2:1,summary)
)
结果:
[,1] [,2] [,3] [,4]
Min. 1 3 5 7
1st Qu. 5 7 9 11
Median 9 11 13 15
Mean 9 11 13 15
3rd Qu. 13 15 17 19
Max. 17 19 21 23
, , 2
[,1] [,2] [,3] [,4]
Min. 2 4 6 8
1st Qu. 6 8 10 12
Median 10 12 14 16
Mean 10 12 14 16
3rd Qu. 14 16 18 20
Max. 18 20 22 24
根据要求,您可以获取其他边际摘要
apply(obs,2,mean)
## [1] 9.5 11.5 13.5 15.5
(仔细检查: mean(obs[,1,])
确实是9.5 ...)
在R工具箱中进行挖掘时,您可能还希望检查plyr
工具: a*ply
。 该函数将array
作为输入,并且很容易控制返回结果的形式:数组,数据框或列表。
为了使我们在处理示例数组时更容易跟踪尺寸,我添加了一些任意尺寸名称。 第一维(行)=物种; 秒(列)=时间; 第三(单独的“表格”)=网站
obs <- array(c(1:24),
dim = c(2, 4, 3),
dimnames = list(species = c("cat", "dog"),
time = 1:4,
site = letters[1:3]))
library(plyr)
# result as (2-d) array: aaply
# i.e. same output as @Ben Bolker's `apply` example
# keep the first two dimensions (species, time), collapse the third (site)
aaply(obs, 1:2, mean)
# time
# species 1 2 3 4
# cat 9 11 13 15
# dog 10 12 14 16
# result as data frame: adply
adply(obs, 1:2, mean)
# species time V1
# 1 cat 1 9
# 2 dog 1 10
# 3 cat 2 11
# 4 dog 2 12
# 5 cat 3 13
# 6 dog 3 14
# 7 cat 4 15
# 8 dog 4 16
# several functions
adply(obs, 1:2, each(min, mean, max))
# species time min mean max
# 1 cat 1 1 9 17
# 2 dog 1 2 10 18
# 3 cat 2 3 11 19
# 4 dog 2 4 12 20
# 5 cat 3 5 13 21
# 6 dog 3 6 14 22
# 7 cat 4 7 15 23
# 8 dog 4 8 16 24
# apparently the `each` thing can be used on just one function as well,
# then the function name appears as column name instead of 'V1' as above.
adply(obs, 1:2, each(mean))
# species time mean
# 1 cat 1 9
# 2 dog 1 10
# 3 cat 2 11
# 4 dog 2 12
# 5 cat 3 13
# 6 dog 3 14
# 7 cat 4 15
# 8 dog 4 16
# one-dimensional summary
adply(obs, 2, each(mean))
# time mean
# 1 1 9.5
# 2 2 11.5
# 3 3 13.5
# 4 4 15.5
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.