2

「R ダンプ」形式でデータを出力するシステムを使用しています。たとえば、次のような 3 次元配列を出力する場合があります。

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 を使用してこのデータの限界要約を検査したいと考えています。たとえば、その 3 番目の次元で平均化された平均値の 2x4 テーブルを見たいと思います。

(可能であれば、周辺の要約が 1 つの次元に折りたたまれていることも確認したいと思います。たとえば、4 つの平均値の行で、各平均は私のデータの 2x3 スライスから取得されます。)

私はsummary(obs)、すべてのディメンションを折りたたんで全体的な統計を表示する方法と、sapply(obs, summary)どのディメンションも折りたたまずに、個々のデータの「概要」を表示する方法を試しました。

私が求めている機能があると思いますが、見つかりません!

4

2 に答える 2

3

R ツールボックスを掘り下げているときに、次のplyrツールを確認することもできますa*ply。この関数はarrayを入力として取り、結果が返される形式 (配列、データ フレーム、またはリスト) を簡単に制御できます。

配列の例をいじる際に次元を追跡しやすくするために、任意の次元名をいくつか追加しました。最初の次元 (行) = 種。秒 (列) = 時間; 3 番目 (個別の「テーブル」) = サイト

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
于 2013-09-22T21:51:13.933 に答える
3

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)コメントで指摘されているように)

結果:

        [,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 です ...)

于 2013-09-22T20:32:20.720 に答える