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
これはまさに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))
おそらくそれほどエレガントではありませんが、
_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, `-`)
_
簡単な解決策:
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
}
Applyを使用した別の方法:
b[,3:5] <- t(apply(b[,3:5], 1, function(x) x-c))