将向量按名称乘以矩阵

3

我看过一些有关矩阵乘法的答案(例如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://dev59.com/dnI_5IYBdhLWcg3wAeHl#2117080
r.prices      <- prices[OrderOfPrices]
dailyrevenue  <- colSums(r.prices * M)

如果我能避免调用order函数,我也不介意使用%*%crossprod(返回一个1行矩阵而不是向量)。

1个回答

4
你可以使用子集操作创建一个正确顺序的价格向量:
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接