提问者:小点点

从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

共3个答案

匿名用户

这正是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])]

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

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

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

匿名用户

另一种方式,申请:

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