2017-10-16 3 views
1

ich einige Antworten auf die Matrixmultiplikation haben gesucht (zB R: matrix by vector multiplication), aber immer noch keine Antwort auf meine Frage finden:R: multiplizieren Vektor durch Matrix nach Namen

ich vier Arten von Obst zu verkaufen, mit Proeinzelteil Preise in diesem Vektor:

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 

die folgende Matrix gibt die Anzahl der einzelnen Elemente an jedem Tag der Woche verkauft:

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 

Beachten Sie, dass die Reihen der Matte rix sind in einer anderen Reihenfolge als der Preisvektor.

Ich mag für jeden Tag einen Vektor meiner Einnahmen generieren, d.h .:

> dailyrevenue 
    M  Tu  W  Th  F 
310.44 170.93 243.72 189.85 315.22 

Gibt es eine schnelle Möglichkeit, R zu sagen, jeden Preis durch seine entsprechenden Zeilennamen zu multiplizieren? Die Standardformen der Multiplikation würden davon ausgehen, dass jede Banane statt der korrekten Menge, $ 0,42, $ 2,25 kostet.

zu bekommen, was ich will, kann ich den folgenden Code verwenden:

OrderOfPrices <- order(match(names(prices), rownames(M))) # per https://stackoverflow.com/a/2117080/8436923 
r.prices  <- prices[OrderOfPrices] 
dailyrevenue <- colSums(r.prices * M) 

Ich würde auch nicht, wenn ich mit %*% oder crossprod (eine 1-reihige Matrix anstatt einen Vektor zurückkehrt) dagegen vermeiden könnte Aufruf der order Funktion.

Antwort

2

Sie subsetting verwenden können Preise Vektor in der richtigen Reihenfolge zu erstellen:

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 
Verwandte Themen