4

行列の各列 (または行) の隣接する値の平均を計算したい (例: [1,1] と [2,1]、[2,1] と [3,1]、[3, 1] および [4,1]) を使用し、これをすべての列に適用します。

mapply 関数を使用して (for ループの使用を避けるため)、各列の最初の 2 つの値の平均を計算し、これを行列全体に行ごとに適用しようとしました。ただし、値を合計しようとすると機能するように見えるmapplyは、平均関数では機能しません。

以下の例を参照してください。

x <- matrix(c(NA,rnorm(28),NA), nrow=6, ncol=5)
print(x)
       [,1]       [,2]       [,3]       [,4]       [,5]
[1,]          NA -0.6557176  1.7741320  0.3667700 -0.5548408
[2,]  0.14001643  0.2521062 -0.1295084 -0.4272368  0.7598425
[3,]  0.32123196  0.5736409  0.8618268  2.1535191  0.4686728
[4,]  0.06573949 -1.2101965 -0.4308219 -0.2624877 -0.3751350
[5,] -0.66247996  1.2743463  1.6044236  1.2004990 -0.3283678
[6,]  1.05005260  1.2264607  3.2347421 -0.8113528         NA

mapply(sum, x[1,], x[2,])
[1]          NA -0.40361136  1.64462358 -0.06046682  0.20500169
# gives the sum of the input of rows 1 and 2 for each column, as expected

mapply(mean, x[1,], x[2,])
[1]         NA -0.6557176  1.7741320  0.3667700 -0.5548408
# gives the actual values across row 1

mean 関数を使用すると、出力は最初の行の値のように見えます。問題は、正しい入力値のインデックス作成にあると思われます。

4

2 に答える 2

0

私はこれがあなたが望むことをすると思います:

(head(x, -1L) + tail(x, -1L)) / 2

生成します (でデータを使用set.seed(1)):

           [,1]       [,2]        [,3]      [,4]       [,5]
[2,]         NA -0.1665197 -0.11569867 0.8825287 -0.6847630
[3,] -0.2214052  0.6128769 -1.41797023 0.7075613  0.2818485
[4,] -0.3259926  0.6570530 -0.54488448 0.7564393 -0.1059621
[5,]  0.3798261  0.1351965  0.53999865 0.8505568 -0.8132739
[6,]  0.9623943  0.6031964 -0.03056194 0.4283506         NA

tail(x, -1L)最初の行を除くすべての行で行列を返します。したがって、結果の行列の最初の行は、元の行列の 2 行目、2 行目は 3 行目などです。次に、これを元の行列から最初の行を引いたものに追加します。これは、2 番目の行を 1 番目に、3 番目を 2 番目に追加することと同じです。

あなたのアプローチが失敗する理由は、すべての引数を合計するのmeanとは異なり、最初の引数のみを平均するためです。sum

> args(mean)
function (x, ...) 
NULL
> args(sum)
function (..., na.rm = FALSE) 
NULL    

sumは をすべて合計しますが...meanの平均を取るだけなxので、 で渡す 2 番目の行は破棄さmeanmapplyます (さらに悪いことに、trim引数として使用されます。 を参照してください?mean)。

于 2015-04-23T13:46:49.567 に答える