Преобразуйте номинальные результаты турниров с круговым турниром в список матриц смежности.

Я хотел бы взять номинальные результаты турнира с круговым циклом и преобразовать их в список бинарных матриц смежности.

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