Magie des matrices
À l’origine, je pensais appeler ce billet » Retour à la base « , puisque je sors du tidyverse pour entrer dans le monde des matrices, mais il n’y a vraiment rien de basique. Parcourons-le pas à pas.
D’abord, nous allons prendre notre tableau et en faire une matrice. Nous ne pouvons pas simplement faire as.matrix()
directement, car cela fera de la colonne Attaque la première colonne, alors que nous voulons que ce soit les rownames, donc nous allons le faire en deux étapes.
m <- as.matrix(type_comparisons)rownames(m) <- type_comparisons$Attacking
Puis, comme nous ne nous préoccupons que de savoir si l’entrée est 2 ou non, nous allons changer chaque entrée qui est un 2 pour qu’elle soit 1 et chaque entrée qui ne l’est pas pour qu’elle soit 0 (le 1L *
fait que c’est 1 ou 0 au lieu de VRAI ou FAUX).
super_effective_m <- (m == 2) * 1L
super_effective_m
## Normal Fire Water Electric Grass Ice Fighting Poison Ground Flying## Normal 0 0 0 0 0 0 0 0 0 0## Fire 0 0 0 0 1 1 0 0 0 0## Water 0 1 0 0 0 0 0 0 1 0## Electric 0 0 1 0 0 0 0 0 0 1## Grass 0 0 1 0 0 0 0 0 1 0## Ice 0 0 0 0 1 0 0 0 1 1## Fighting 1 0 0 0 0 1 0 0 0 0## Poison 0 0 0 0 1 0 0 0 0 0## Ground 0 1 0 1 0 0 0 1 0 0## Flying 0 0 0 0 1 0 1 0 0 0## Psychic 0 0 0 0 0 0 1 1 0 0## Bug 0 0 0 0 1 0 0 0 0 0## Rock 0 1 0 0 0 1 0 0 0 1## Ghost 0 0 0 0 0 0 0 0 0 0## Dragon 0 0 0 0 0 0 0 0 0 0## Dark 0 0 0 0 0 0 0 0 0 0## Steel 0 0 0 0 0 1 0 0 0 0## Fairy 0 0 0 0 0 0 1 0 0 0## Psychic Bug Rock Ghost Dragon Dark Steel Fairy## Normal 0 0 0 0 0 0 0 0## Fire 0 1 0 0 0 0 1 0## Water 0 0 1 0 0 0 0 0## Electric 0 0 0 0 0 0 0 0## Grass 0 0 1 0 0 0 0 0## Ice 0 0 0 0 1 0 0 0## Fighting 0 0 1 0 0 1 1 0## Poison 0 0 0 0 0 0 0 1## Ground 0 0 1 0 0 0 1 0## Flying 0 1 0 0 0 0 0 0## Psychic 0 0 0 0 0 0 0 0## Bug 1 0 0 0 0 1 0 0## Rock 0 1 0 0 0 0 0 0## Ghost 1 0 0 1 0 0 0 0## Dragon 0 0 0 0 1 0 0 0## Dark 1 0 0 1 0 0 0 0## Steel 0 0 1 0 0 0 0 1## Fairy 0 0 0 0 1 1 0 0
La matrice all_combinations
que nous avons créée précédemment est essentiellement un ensemble d’indices pour la matrice super_effective_m
. Par exemple, la colonne 1 de all_combinations
sont les chiffres 1 à 6, ce qui signifie que nous voulons obtenir les lignes 1 à 6 de super_effective_m
. Rappelez-vous, chaque ligne de super_effective_m
est un type d’attaque de notre équipe, et chaque colonne est un type de défense. Nous voulons ensuite obtenir la somme de chaque colonne et savoir combien de colonnes ont une somme supérieure à 0, ce qui signifie qu’au moins un de nos types d’attaque a été super efficace contre lui. Nous allons faire une fonction, super_effective_nb
:
super_effective_nb <- function(indices) { sum(colSums(super_effective_m) > 0)}
Maintenant nous pouvons utiliser apply()
pour obtenir un vecteur, pour toutes les équipes de 18k+, du nombre de types contre lesquels ils sont super efficaces. Si vous n’êtes pas familier avec apply()
, le premier argument est ce à quoi nous appliquons notre fonction, le deuxième est de savoir si elle doit s’appliquer aux lignes ou aux colonnes (nous choisissons 2 pour la colonne, puisque chaque colonne est l’équipe), et le troisième est la fonction.
super_effective_results <- apply(all_combinations, 2, super_effective_nb)
Quelles sont les combinaisons qui sont super efficaces contre le maximum de types possibles ?
which(super_effective_results == max(super_effective_results))
## 14323 14325 15610 15612 16454 16459 16852 16854 16989 16994
Nous voyons qu’il y a 10 combinaisons possibles de six types. Voyons-les en récupérant ces colonnes dans all_combinations
.
best_combos <- all_combinationsbest_combos
## ## 4 4 5 5 5 5 6 6 6 6## 6 6 6 6 8 8 7 7 7 7## 7 7 7 7 9 9 8 8 9 9## 9 9 9 9 13 13 9 9 10 10## 10 10 10 10 14 16 10 10 14 16## 14 16 14 16 18 18 14 16 17 17
Nous avons maintenant une matrice, best_combo
, où chaque colonne est une équipe. Par exemple, nous voyons une équipe de types 4, 6, 7, 9, 10 et 14 couvrir le maximum de types de défense. Mais qu’est-ce que le type 4 ? Pour répondre à cela, nous prenons les noms des lignes de super_effective_m
et l’indexons par best_combos
.
rownames(super_effective_m)
## "Electric" "Ice" "Fighting" "Ground" "Flying" "Ghost" ## "Electric" "Ice" "Fighting" "Ground" "Flying" "Dark" ## "Grass" "Ice" "Fighting" "Ground" "Flying" "Ghost" ## "Grass" "Ice" "Fighting" "Ground" "Flying" "Dark" ## "Grass" "Poison" "Ground" "Rock" "Ghost" "Fairy" ## "Grass" "Poison" "Ground" "Rock" "Dark" "Fairy" ## "Ice" "Fighting" "Poison" "Ground" "Flying" "Ghost" ## "Ice" "Fighting" "Poison" "Ground" "Flying" "Dark" ## "Ice" "Fighting" "Ground" "Flying" "Ghost" "Steel" ## "Ice" "Fighting" "Ground" "Flying" "Dark" "Steel"
Cela nous donne un vecteur de caractères cependant. C’est dans l’ordre, donc on sait que les six premiers sont de l’équipe 1, les six seconds de l’équipe 2, etc, mais ça ne s’affiche pas très bien. Nous pouvons utiliser matrix
pour transformer cela en une matrice à la place, en spécifiant que nous voulons 6 lignes.
strongest_teams <- matrix(rownames(super_effective_m), nrow = 6)
strongest_teams
## ## "Electric" "Electric" "Grass" "Grass" "Grass" "Grass" "Ice" ## "Ice" "Ice" "Ice" "Ice" "Poison" "Poison" "Fighting"## "Fighting" "Fighting" "Fighting" "Fighting" "Ground" "Ground" "Poison" ## "Ground" "Ground" "Ground" "Ground" "Rock" "Rock" "Ground" ## "Flying" "Flying" "Flying" "Flying" "Ghost" "Dark" "Flying" ## "Ghost" "Dark" "Ghost" "Dark" "Fairy" "Fairy" "Ghost" ## ## "Ice" "Ice" "Ice" ## "Fighting" "Fighting" "Fighting"## "Poison" "Ground" "Ground" ## "Ground" "Flying" "Flying" ## "Flying" "Ghost" "Dark" ## "Dark" "Steel" "Steel"
Pour notre dernière étape, nous allons en fait transformer cela en tableau, afin que je puisse regarder quels types apparaissent le plus souvent parmi les différentes possibilités d’équipe.
strongest_teams %>% as_tibble() %>% gather(team, type) %>% count(type, sort = TRUE) %>% knitr::kable()
type | n |
---|---|
Ground | 10 |
Combat | 8 | Volant | 8 | Glace | 8 | Sombre | 5 |
Ghost | 5 |
Grass | 4 |
Poison | 4 | Electric | 2 | Fairy | 2 |
Rock | 2 |
Acier | 2 |
Nous voyons que les 10 équipes ont toutes besoin d’un type de terrain, où 8 ont un type de combat, de vol, ou de glace. D’autre part, Électrique, Fée, Roche et Acier ne sont utilisés chacun que par deux équipes.