Преобразуйте номинальные результаты турниров с круговым турниром в список матриц смежности.
Я хотел бы взять номинальные результаты турнира с круговым циклом и преобразовать их в список бинарных матриц смежности.
Условно, результаты этих турниров записываются путем записи имени победителя. Вот код для примера таблицы, где четыре человека (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".
Буду признателен за любую оказанную помощь.
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