从三个变量的 csv 文件创建邻接矩阵

Create an adjacency matrix from a csv file of three variables

所以我有一个包含三个变量的 csv 文件 'Team 1' 'Team 2' 和 'Winner.' 我想创建一个具有 rownames=colnames 的邻接矩阵。有什么办法可以做到这一点?这就是我想要的:

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

所以这个特定的矩阵表明 A 从 B 赢了 1 次,B 从 A 赢了 2 次,依此类推。行名表示获胜者。

例如,如果我的数据如下所示:

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

将给出矩阵

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

我的代码

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

这创建了邻接矩阵,但我该如何填充它?

这就是你想要的吗?它会像您的第一个示例中那样创建一个包含团队的矩阵。

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

您可以使用 table 来提取结果。

首先,您可能希望为所有团队设置通用级别

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

然后table数据

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

如果您想要一个特定的顺序,您可以在使用 table 之前将变量设置为因子,或者您可以在

之后更改顺序
vars <- c("Germany", "Argentina","Croatia")
res[vars, vars]

数据

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