R 将循环赛的标称结果转换为邻接矩阵列表
我想从一个循环赛中获得一个标称结果,并将它们转换为一个二进制邻接矩阵列表 按照惯例,这些比赛的结果是通过记录获胜者的名字来记录的。下面是四个人(A、B、C、D)相互竞争的示例表代码: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
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,…)?谢谢你的帮助。