web-dev-qa-db-ja.com

rの行列の各行から定数ベクトルを引きます

5列4行のマトリックスがあります。また、3列のベクターもあります。マトリックスの各行の列3、4、5からベクトルの値をそれぞれ減算します。

b <- matrix(rep(1:20), nrow=4, ncol=5)
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    5    9   13   17
[2,]    2    6   10   14   18
[3,]    3    7   11   15   19
[4,]    4    8   12   16   20

c <- c(5,6,7)

取得するため

     [,1] [,2] [,3] [,4] [,5]
[1,]    1    5    4    7   10
[2,]    2    6    5    8   11
[3,]    3    7    6    9   12
[4,]    4    8    7   10   13
21
user3651829

これはまさにsweepが作成されたものです:

b <- matrix(rep(1:20), nrow=4, ncol=5)
x <- c(5,6,7)

b[,3:5] <- sweep(b[,3:5],2,x)
b

#     [,1] [,2] [,3] [,4] [,5]
#[1,]    1    5    4    7   10
#[2,]    2    6    5    8   11
#[3,]    3    7    6    9   12
#[4,]    4    8    7   10   13

..またはサブセット化や再割り当てなしでも:

sweep(b,2,c(0,0,x))
49
thelatemail

おそらくそれほどエレガントではありませんが、

_b <- matrix(rep(1:20), nrow=4, ncol=5)
x <- c(5,6,7)

b[,3:5] <- t(t(b[,3:5])-x)
_

トリックを行う必要があります。マトリックスをサブセット化して必要な部分のみを変更し、t()(転置)を使用してマトリックスを反転し、単純なベクトルリサイクルが正しい行からの減算を処理するようにします。

転置を避けたい場合は、次のようなことができます

_b[,3:5] <- b[,3:5]-x[col(b[,3:5])]
_

同様に。ここでは2回サブセット化し、2番目のマトリックスを使用してxの各値の正しい列を取得します。これらのマトリックスは両方とも同じ順序でインデックス付けされるためです。

@thelatemailがリンクしたという質問の中で私のお気に入りだったと思います

_b[,3:5] <- sweep(b[,3:5], 2, x, `-`)
_
6
MrFlick

簡単な解決策:

b <- matrix(rep(1:20), nrow=4, ncol=5)
c <- c(5,6,7)

for(i in 1:nrow(b)) {
  b[i,3:5] <- b[i,3:5] - c
}
2
Barranka

Applyを使用した別の方法:

b[,3:5] <- t(apply(b[,3:5], 1, function(x) x-c))
2
psadosky