вычесть постоянный вектор из каждой строки в матрице из r

У меня есть матрица с 5 столбцами и 4 строками. У меня также есть вектор с тремя столбцами. Я хочу вычесть значения в векторе из столбцов 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

Ответ 1

Это именно то, что 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))

Ответ 2

Возможно, не так элегантно, но

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, '-')

Ответ 3

Другой способ: применить:

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

Ответ 4

Простое решение:

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
}