outer 関数の第三引数に mean を使いたい Last modified: Apr 21, 2004
具体例:
x : (1, 2, 3, 4)
などというベクトルがあったとき,
行列の要素 A[i, j] が (x[i]+x[j])/2
つまり x[i] と x[j] の平均値となるようにしたい
プログラム例:
> x <- 1:4
> outer(x, x, mean)
としたのでは以下のようになってしまい,期待する結果は得られない。
[,1] [,2] [,3] [,4]
[1,] 2.5 2.5 2.5 2.5
[2,] 2.5 2.5 2.5 2.5
[3,] 2.5 2.5 2.5 2.5
[4,] 2.5 2.5 2.5 2.5
R 2.0.0 以降では,
Error in outer(x, x, mean) : dim<- : dims [product 16] do not match the length of object [1]
というエラーメッセージが出るようになった
> outer(x, x, "+")/2
とすれば,期待通りの結果になるが,もっとスマート(?)にしたい。
[,1] [,2] [,3] [,4]
[1,] 1.0 1.5 2.0 2.5
[2,] 1.5 2.0 2.5 3.0
[3,] 2.0 2.5 3.0 3.5
[4,] 2.5 3.0 3.5 4.0
前もって
> mean2 <- function(x, y) (x+y)/2
という二変数関数を定義しておいて,第三引数にその関数名を書いて
> outer(x, x, mean2)
という風にすればよい。
[,1] [,2] [,3] [,4]
[1,] 1.0 1.5 2.0 2.5
[2,] 1.5 2.0 2.5 3.0
[3,] 2.0 2.5 3.0 3.5
[4,] 2.5 3.0 3.5 4.0
> outer(x, x, function(a, b) (a+b)/2)
のように,第三引数に,直接関数定義を書いても良い。
[,1] [,2] [,3] [,4]
[1,] 1.0 1.5 2.0 2.5
[2,] 1.5 2.0 2.5 3.0
[3,] 2.0 2.5 3.0 3.5
[4,] 2.5 3.0 3.5 4.0
直前のページへ戻る
E-mail to Shigenobu AOKI