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

时间:2018-10-14 11:02:15

标签: r adjacency-matrix

所以我有一个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

这将创建邻接矩阵,但是我该如何填写?

2 个答案:

答案 0 :(得分:1)

您可以使用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")

答案 1 :(得分:0)

这是您的追求吗?它与第一个示例中的团队一样创建了一个矩阵。

Iterator it = list.iterator();
while (it.hasNext()) {
    Object thing = it.next();
    if (ThisIsTheObjectWeAreLookingFor(thing)) {
        it.remove();
        list.addFirst(thing);
        return thing;
    }
}