1
votes

Multipliez deux objets dans R

Une question rapide liée à la multiplication des deux objets numériques. Voici à quoi ressemblent mes deux objets.

P1       P2        P(P1*P2)
Low      Low       0.0625
Medium   Low       0.125
High     Low       0.0625
Low      Medium    0.125
Medium   Medium    0.250
High     Medium    0.125
Low      High      0.0625
Medium   High      0.125
High     High      0.0625

Je veux avoir quelque chose comme ci-dessous.

P1 <- c(Low=.25,Medium=.50,High=.25)
P2 <- c(Low=.25,Medium=.50,High=.25)

Des pensées à ce sujet?

Merci! p>


4 commentaires

Comme ça? cbind (P1, P2, P3 = P1 * P2) ou simplement melt .


Cela ne calcule pas réellement toutes les combinaisons. Seules trois valeurs ont été évoquées.


reshape2 :: melt (extérieur (P1, P2)) ?


Cela fonctionne très bien! Merci! :)


3 Réponses :


4
votes

Le produit externe est calculé par outer:

reshape2::melt(out, value.name = "P(P1*P2)")

      P1     P2 P(P1*P2)
1    Low    Low   0.0625
2 Medium    Low   0.1250
3   High    Low   0.0625
4    Low Medium   0.1250
5 Medium Medium   0.2500
6   High Medium   0.1250
7    Low   High   0.0625
8 Medium   High   0.1250
9   High   High   0.0625

Ensuite, vous pouvez le mettre sous forme longue en utilisant le package reshape2:

out <- outer(P1, P2)
dimnames(out) <- setNames(dimnames(out), c("P1", "P2"))        

    P2
P1          Low Medium   High
  Low    0.0625  0.125 0.0625
  Medium 0.1250  0.250 0.1250
  High   0.0625  0.125 0.0625


0 commentaires

1
votes

J'utiliserais la syntaxe tidyverse avec expand.grid:

library(tidyverse)
P1 <- tribble(
  ~level, ~value1,
  "Low", 0.25,
  "Medium", 0.5,
  "High", 0.25
)
P2 <- tribble(
  ~level, ~value2,
  "Low", 0.25,
  "Medium", 0.5,
  "High", 0.25
)

expand.grid(p1_lev = P1$level, p2_lev = P2$level) %>% 
  left_join(P1, by = c("p1_lev" = "level")) %>% 
  left_join(P2, by = c("p2_lev" = "level")) %>% 
  mutate(new_value = value1*value2) %>% 
  select(-value1, -value2)



0 commentaires

1
votes

Un autre, un peu similaire à ci-dessus:

library(tidyverse)

expand.grid(names(P1), names(P2)) %>%
  mutate(Var3 = P1[Var1] * P2[Var2]) %>%
  rename(Var1 = "P1", Var2 = "P2", Var3 = "P(P1 * P2)")

      P1     P2 P(P1 * P2)
1    Low    Low     0.0625
2 Medium    Low     0.1250
3   High    Low     0.0625
4    Low Medium     0.1250
5 Medium Medium     0.2500
6   High Medium     0.1250
7    Low   High     0.0625
8 Medium   High     0.1250
9   High   High     0.0625


0 commentaires