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
Другие вопросы по тегам