2

我想从循环锦标赛中获取名义结果并将它们转换为二进制邻接矩阵列表。

按照惯例,这些比赛的结果是通过记录获胜者的名字来写的。这是一个示例表的代码,其中四个人(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)

这是表格:

> roundrobin
   set trial home visitor winners.rr1 winners.rr2 winners.rr3
1    1     1    B       D           D           D           D
2    1     2    A       C           A           A           A
3    1     3    C       B           B           C           B
4    1     4    D       A           A           A           A
5    1     5    B       A           A           A           A
6    1     6    C       D           D           D           D
7    2     7    D       B           D           D           D
8    2     8    C       A           A           A           A
9    2     9    B       C           B           C           B
10   2    10    A       D           D           A           D
11   2    11    A       B           A           A           A
12   2    12    D       C           D           D           D

此表显示了三场循环赛的获胜者。在每场比赛中,有两组:每个球员在主场与其他所有球员比赛一次,一次作为访客。这样一来,每场循环赛总共进行 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

这是第一轮循环赛第 2 组的样子:

> 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”。

任何帮助深表感谢。

4

1 回答 1

1

这是一种解决方法,尽管我认为必须有一种更简单的方法 - 可能涉及plyr. 下面将数据框拆分为对应于 的子集set,然后,对于每一轮,设置一个零表(带有 NA 对角线)来保存结果,最后通过用矩阵对表进行子集将“获胜单元格”设置为 1。输出类设置为matrix确保矩阵如此呈现。

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
  })
})

第 1 组的结果:

> results[[1]]

[[1]]

     A  B  C  D
  A NA  1  1  1
  B  0 NA  1  0
  C  0  0 NA  0
  D  0  1  1 NA

[[2]]

     A  B  C  D
  A NA  1  1  1
  B  0 NA  0  0
  C  0  1 NA  0
  D  0  1  1 NA

[[3]]

     A  B  C  D
  A NA  1  1  1
  B  0 NA  1  0
  C  0  0 NA  0
  D  0  1  1 NA
于 2014-03-24T22:09:49.357 回答