我有一个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)
也许不那么优雅,但是
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)