2017-10-16 63 views
1

我已经看了一些答案的矩阵乘法(如R: matrix by vector multiplication)乘以矩阵向量但仍无法找到答案,我的问题: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 

注意,垫的行rix的价格与价格矢量的顺序不同。

我要生成的每一天我的收入的载体,即:

> 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://stackoverflow.com/a/2117080/8436923 
r.prices  <- prices[OrderOfPrices] 
dailyrevenue <- colSums(r.prices * M) 

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

回答

2

您可以使用子集来创建以正确的顺序一个价格向量:

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