从r中的矩阵中的每一行中减去一个常量向量

use*_*829 24 r vector matrix

我有一个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)
Run Code Online (Sandbox Code Playgroud)

要得到

     [,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
Run Code Online (Sandbox Code Playgroud)

the*_*ail 53

这正是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
Run Code Online (Sandbox Code Playgroud)

..甚至没有子集或重新分配:

sweep(b,2,c(0,0,x))
Run Code Online (Sandbox Code Playgroud)


MrF*_*ick 7

也许不那么优雅,但是

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

b[,3:5] <- t(t(b[,3:5])-x)
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩.我们将矩阵子集化以仅改变我们需要的部分,并且我们使用t()(转置)来翻转矩阵,因此简单的向量回收将负责从正确的行中减去.

如果你想避免转置,你可以做类似的事情

b[,3:5] <- b[,3:5]-x[col(b[,3:5])]
Run Code Online (Sandbox Code Playgroud)

同样.这里我们将子集两次,并且我们使用第二个来为每个值获取正确的列,x因为这两个矩阵将以相同的顺序索引.

我认为我最喜欢的是@thelatemail链接的问题

b[,3:5] <- sweep(b[,3:5], 2, x, `-`)
Run Code Online (Sandbox Code Playgroud)