R: умножить вектор на матрицу в соответствии с именами
Я посмотрел некоторые ответы на умножение матриц (например, R: матричное умножение векторов), но все еще не могу найти ответ на мой вопрос:
Я продаю четыре вида фруктов с ценой за единицу товара в этом векторе:
prices <- c(2.25, 0.42, 0.85, 1.24)
names(prices) <- c("pomegranate", "banana", "apple", "mango")
> prices
pomegranate banana apple mango
2.25 0.42 0.85 1.24
Следующая матрица показывает количество каждого проданного товара в каждый день недели:
vv <- c(43, 87, 48, 90, 99, 60, 1, 62, 62, 107, 34, 10, 130, 15, 5, 124, 124, 101, 22, 104)
M <- matrix(vv, nrow=4, ncol=5, dimnames=list(c("banana", "mango", "pomegranate", "apple"), c("M", "Tu", "W", "Th", "F")))
> M
M Tu W Th F
banana 43 99 62 130 124
mango 87 60 107 15 101
pomegranate 48 1 34 5 22
apple 90 62 10 124 104
Обратите внимание, что строки матрицы расположены в другом порядке, чем вектор цен.
Я хочу создать вектор моего дохода за каждый день, а именно:
> dailyrevenue
M Tu W Th F
310.44 170.93 243.72 189.85 315.22
Есть ли какой-нибудь быстрый способ сказать R умножить каждую цену на соответствующее имя строки? Стандартные формы умножения предполагают, что каждый банан стоит 2,25 доллара, а не правильная сумма - 0,42 доллара.
Чтобы получить то, что я хочу, я могу использовать следующий код:
OrderOfPrices <- order(match(names(prices), rownames(M))) # per https://stackru.com/a/2117080/8436923
r.prices <- prices[OrderOfPrices]
dailyrevenue <- colSums(r.prices * M)
Я также не против использования %*%
или же crossprod
(возвращая матрицу из 1 строки, а не вектор), если бы я мог избежать вызова order
функция.
1 ответ
Вы можете использовать поднаборы для создания вектора цен в правильном порядке:
pricesm <- prices[rownames(M)]
pricesm
#banana mango pomegranate apple
# 0.42 1.24 2.25 0.85
rev <- pricesm %*% M
rev
# M Tu W Th F
#[1,] 310.44 170.93 243.72 189.85 315.22