2009年10月5日月曜日

sweep関数に関しての調査

Rのプログラミングに関する本を読んでいて,
sweep関数の挙動が文章の説明だけでは分からなかった.
ぐぐってみるとRjpWikiにあったので,調査してみた.

基本的な使い方は
sweep(x, MARGIN, STATS, FUN="-", check.margin=TRUE, ...)
となっていて,配列に対し,MARGINの方向にSTATSを用いてFUNを施す
という意味のようである.デフォルトでは引き算になるとのこと.
check.marginは次元のチェックをしてくれる.FALSEにするとわずかに速くなるが,
次元が一致していることをすでに知ってなければ使わないようにと書いてある.
基本はTRUEにしておけということらしい.

sweepというと一掃するいう意味で,試合で相手をシャットアウトしたときに
用いられるよね.語感と少し違うよう関数のような気がする.

それはさておき,実際に動作を試してみよう.
x <- matrix(1:16,nrow=4)
y <- 1:nrow(x)
sweep(x,1,y)
sweep(x,2,y)
sweep(x,1,y,"/")
としてみると,実行結果は
> x
[,1] [,2] [,3] [,4]
[1,]    1    5    9   13
[2,]    2    6   10   14
[3,]    3    7   11   15
[4,]    4    8   12   16
> sweep(x,1,y)
[,1] [,2] [,3] [,4]
[1,]    0    4    8   12
[2,]    0    4    8   12
[3,]    0    4    8   12
[4,]    0    4    8   12
> sweep(x,2,y)
[,1] [,2] [,3] [,4]
[1,]    0    3    6    9
[2,]    1    4    7   10
[3,]    2    5    8   11
[4,]    3    6    9   12
> sweep(x,1,y,"/")
[,1]     [,2]     [,3] [,4]
[1,]    1 5.000000 9.000000   13
[2,]    1 3.000000 5.000000    7
[3,]    1 2.333333 3.666667    5
[4,]    1 2.000000 3.000000    4
となった.
2番目の結果では行ごとに1から4が引かれていて,
3番目の結果では列ごとに1から4が引かれている.
MARGINで1を指定すると行方向,2を指定すると列方向に演算が
行われている.この辺はapply関数に良く似ていると思う.

また最後の例では,デフォルトの引き算から割り算に変えてみると,
行ごとにそれぞれ1から4で割られていることが分かる.

文章と実際の例があると分かりやすいですね.

0 件のコメント:

コメントを投稿

フォロワー

ページビューの合計