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

Made with Macintosh