R:根据名称将向量乘以矩阵
R: multiply vector by matrix according to names
我看过一些关于矩阵乘法的答案(例如 R: matrix by vector multiplication),但仍然找不到我的问题的答案:
我卖四种水果,每件商品的价格在此向量中:
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
r.prices <- prices[OrderOfPrices]
dailyrevenue <- colSums(r.prices * M)
如果我可以避免调用 order
函数,我也不介意使用 %*%
或 crossprod
(返回 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
我看过一些关于矩阵乘法的答案(例如 R: matrix by vector multiplication),但仍然找不到我的问题的答案:
我卖四种水果,每件商品的价格在此向量中:
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
r.prices <- prices[OrderOfPrices]
dailyrevenue <- colSums(r.prices * M)
如果我可以避免调用 order
函数,我也不介意使用 %*%
或 crossprod
(返回 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