まとめ
sweep関数の
- MARGIN = 1の時は
- i 行目のそれぞれの値に対してSTATSの i番目の値をFUNと二項演算する
- MARGIN = 2の時は
- j 列目のそれぞれの値に対してSTATSの j番目の値をFUNと二項演算する
お気持ち
行平均の引き算のお気持ち
- sweepで1行目の行平均を引き算したいとき、1行目の各要素から引き算する値はスカラーな行平均。
- sweepで2行目の行平均を引き算したいとき、2行目の各要素から引き算する値はスカラーな行平均。
- ...
となる。sweep(mat, MARGIN = 1, ...)の時、1行目ベクトルからSTATSベクトルを減算し、2行目ベクトルからSTATSベクトルを減算し・・・とはならないので要注意。 忘れたら行平均の減算、列平均の減算を思い出そう。
確認コード
MARGIN = 1の場合
> # 行列を生成し > (m <- matrix(c(3,1,4,1,5,9,2,6,5,3,5,9),ncol=4)) [,1] [,2] [,3] [,4] [1,] 3 1 2 3 [2,] 1 5 6 5 [3,] 4 9 5 9 > # 行平均を確認 > rowMeans(m) [1] 2.25 4.25 6.75 > # 行平均を各行から引く > sweep(m, MARGIN = 1, STATS = rowMeans(m), FUN = "-") [,1] [,2] [,3] [,4] [1,] 0.75 -1.25 -0.25 0.75 [2,] -3.25 0.75 1.75 0.75 [3,] -2.75 2.25 -1.75 2.25 >
MARGIN = 2 の場合
> # 列平均を確認 > colMeans(m) [1] 2.666667 5.000000 4.333333 5.666667 > # 列平均を各列から引く > sweep(m, MARGIN = 2, STATS = colMeans(m), FUN = "-") [,1] [,2] [,3] [,4] [1,] 0.3333333 -4 -2.3333333 -2.6666667 [2,] -1.6666667 0 1.6666667 -0.6666667 [3,] 1.3333333 4 0.6666667 3.3333333 >
となる。