вычесть постоянный вектор из каждой строки в матрице из 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
}