R 将循环赛的标称结果转换为邻接矩阵列表

R 将循环赛的标称结果转换为邻接矩阵列表,r,matrix,adjacency-matrix,round-robin,sna,R,Matrix,Adjacency Matrix,Round Robin,Sna,我想从一个循环赛中获得一个标称结果,并将它们转换为一个二进制邻接矩阵列表 按照惯例,这些比赛的结果是通过记录获胜者的名字来记录的。下面是四个人(A、B、C、D)相互竞争的示例表代码: set <- c(rep(1, 6), rep(2,6)) trial <- (1:12) home <- c("B", "A", "C", "D", "B", "C", "D", "C", "B", "A", "A", "D") visitor <- c("D", "C", "B", "A

我想从一个循环赛中获得一个标称结果,并将它们转换为一个二进制邻接矩阵列表

按照惯例,这些比赛的结果是通过记录获胜者的名字来记录的。下面是四个人(A、B、C、D)相互竞争的示例表代码:

set <- c(rep(1, 6), rep(2,6))
trial <- (1:12)
home <- c("B", "A", "C", "D", "B", "C", "D", "C", "B", "A", "A", "D")
visitor <- c("D", "C", "B", "A", "A", "D", "B", "A", "C", "D", "B", "C" )
winners.rr1 <- c("D", "A", "B", "A", "A", "D", "D", "A", "B", "D", "A", "D")
winners.rr2 <- c("D", "A", "C", "A", "A", "D", "D", "A", "C", "A", "A", "D")
winners.rr3 <- c("D", "A", "B", "A", "A", "D", "D", "A", "B", "D", "A", "D")
roundrobin <- data.frame(set=set, trial=trial, home=home, visitor=visitor,
                         winners.rr1=winners.rr1, winners.rr2=winners.rr2,
                         winners.rr3=winners.rr3)
此表显示了三个循环赛的获胜者。在每场比赛中,有两套:每名球员在家里和所有其他球员竞争一次,作为访客竞争一次。这使得每个循环赛总共有12次试赛

因此,在第一盘的第一次试赛中,球员D击败了球员B。在第一盘的第二次试赛中,球员A击败了球员C,以此类推

我想把这些结果转化为六个邻接矩阵的列表。每个矩阵将从每个循环赛的每个集合中导出。在中,获胜记录为“1”,而在中,失败记录为“0”。(“家”和“访客”的名称与下文无关)

下面是第一轮循环中集合1的邻接矩阵的样子:

> Adj.mat.set1.rr1
  X  A  B  C  D
1 A NA  1  1  1
2 B  0 NA  1  0
3 C  0  0 NA  0
4 D  0  1  1 NA
> Adj.mat.set2.rr1
  X  A  B  C  D
1 A NA  1  1  0
2 B  0 NA  1  0
3 C  0  0 NA  0
4 D  1  1  1 NA
下面是第一轮比赛的第二盘:

> Adj.mat.set1.rr1
  X  A  B  C  D
1 A NA  1  1  1
2 B  0 NA  1  0
3 C  0  0 NA  0
4 D  0  1  1 NA
> Adj.mat.set2.rr1
  X  A  B  C  D
1 A NA  1  1  0
2 B  0 NA  1  0
3 C  0  0 NA  0
4 D  1  1  1 NA
后一个矩阵显示,例如,球员A赢得了2次试训,球员B赢得了1次试训,球员C赢得了0次试训,球员D赢得了3次试训

因此,这种操作的诀窍是将每次获胜(记录为名称)转换为邻接矩阵上相应行中的“1”分,而失败则记录为“0”


非常感谢任何帮助。

这里有一种方法,尽管我认为必须有一种更简单的方法-可能涉及
plyr
。下面将数据帧拆分为与
对应的子集,然后,对于每一轮,设置一个0表(带有NA对角线)以保存结果,最后通过使用矩阵将该表子集化,将“获胜单元格”设置为1。输出类被设置为
矩阵
,以确保矩阵是这样显示的

results <- lapply(split(roundrobin, roundrobin$set), function(set) {
  lapply(grep('^winners', names(set)), function(i) {
    tab <- table(set$home, set$visitor)
    tab[] <- 0
    diag(tab) <- NA
    msub <- t(apply(set, 1, function(x) {
      c(x[i], setdiff(c(x['home'], x['visitor']), x[i]))
    }))
    tab[msub] <- 1
    class(tab) <- 'matrix'
    tab
  })
})

关于输出,我还有一个问题:在当前代码中,输出按集合第一和循环锦标赛第二排序(即set1:rr1,rr2,…;set2:rr1,rr2,…)。您能否帮助我修改脚本,使输出按循环锦标赛排序(即rr1:set1,set2;rr2:set1,set2,…)?谢谢你的帮助。