我想从循环锦标赛中获得名义上的结果,并将其转换为二进制邻接矩阵的列表。
按照惯例,这些比赛的结果是通过记录获胜者的姓名来写的。这是一个示例表的代码,其中四个人(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”。
任何帮助深表感谢。
这是解决问题的一种方法,尽管我认为必须有一个更简单的方法-可能涉及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
})
})
第一组的结果:
> 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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句