2 votes

Créer une matrice d'adjacence à partir d'un fichier csv de trois variables

J'ai donc un fichier csv avec trois variables : " Équipe 1 ", " Équipe 2 " et " Gagnant ". Je veux créer une matrice d'adjacence avec rownames=colnames. Existe-t-il un moyen d'y parvenir ? Voici ce que je veux :

   A B C
A  0 2 1    
B  1 0 3    
C  2 4 0

Cette matrice particulière indiquerait donc que A a gagné contre B 1 fois et B contre A 2 fois, et ainsi de suite. Les noms de rown indiquent les gagnants.

Par exemple, si mes données ressemblent à ceci :

   Team A       Team B      Winner
  Germany    Argentina     Germany
  Croatia      Germany     Croatia
Argentina      Croatia   Argentina

donnerait la matrice

            Germany Argentina   Croatia 
Germany           0         0         1  
Argentina         1         0         0  
Croatia           0         1         0

Mon code

data = as.matrix(read.csv("data.csv"))

labels = unique(c(data[,1],data[,2]))
A = matrix(0, length(labels),length(labels))

rownames(A) = colnames(A) <- labels
A

Cela crée la matrice d'adjacence, mais comment la remplir ?

1voto

user20650 Points 16271

Vous pourriez utiliser table pour sortir les résultats.

Tout d'abord, vous pouvez définir des niveaux communs pour toutes les équipes

lvs <- sort(as.character(unique(unlist(d))))
d[] <- lapply(d, factor, levels=lvs)

Entonces table les données

res <- table(d[c("Team.A", "Winner")]) + table(d[c("Team.B", "Winner")])    
diag(res) <- 0
res

#            Winner
# Team.A      Argentina Croatia Germany
#   Argentina         0       0       1
#   Croatia           1       0       0
#   Germany           0       1       0

Si vous voulez un ordre spécifique, vous pouvez définir les variables comme facteur avant d'utiliser table ou vous pouvez changer l'ordre après

vars <- c("Germany", "Argentina","Croatia")
res[vars, vars]

Données

d <- read.table(header=T, text="'Team A'       'Team B'      Winner
  Germany    Argentina     Germany
  Croatia      Germany     Croatia
Argentina      Croatia   Argentina")

0voto

william3031 Points 1252

C'est ce que vous cherchez ? Cela crée une matrice avec les équipes comme dans votre premier exemple.

x = cbind(c(0, 1, 2), c(2, 0, 4), c(1, 3, 0))

colnames(x) <- c("Germany","Argentina","Croatia")
rownames(x) <- c("Germany","Argentina","Croatia")

x

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X