Как создать настраиваемый тай-брейк? - PullRequest
0 голосов
/ 28 октября 2018

Пример df:

set.seed(1)
df <- tibble(name = fruit[1:10],
             A = rpois(10, 10),
             B = rpois(10, 2),
             C = rpois(10, 6),
             D = rpois(10, 2))

           name  A B C D A_rank AB_rank ABC_rank ABCD_rank
1         apple  8 1 8 2      9       9        8         7
2       apricot 10 1 7 3      7       7        4         5
3       avocado  7 0 8 0     10      10        9        10
4        banana 11 1 3 2      4       5        9         9
5   bell pepper 14 4 7 3      1       1        1         1
6      bilberry 12 1 5 3      3       3        4         5
7    blackberry 11 2 8 2      4       3        3         3
8  blackcurrant  9 2 7 4      8       7        4         4
9  blood orange 14 2 8 2      1       2        2         2
10    blueberry 11 1 6 1      4       5        4         7

Это основано на вопросе, который я задал ранее , где я хотел выполнить построчные вычисления для вычисления рангов по постепенно накапливающимся суммам каждого столбца,где более высокая сумма = более низкий ранг.

df <- bind_cols(df, apply(-apply(df[, -1], 1, cumsum), 1, min_rank) %>% 
          as_tibble() %>% 
          rename(A_rank = A, AB_rank = B, ABC_rank = C, ABCD_rank = D))

Однако сейчас я хотел бы включить настраиваемую функцию разрешения конфликтов, основанную на правилах, которую не предоставляют base R или dplyr.Правила для моей функции тай-брейка при расчете каждого ранга таковы:

  • Плод с наибольшим количеством очков в большинстве событий выигрывает
  • Если связь остается, тофрукты с наибольшим количеством очков в любом столбце получат более высокое место.
    • Если связь все еще существует, сравните второе по величине количество точек и т. Д.
  • В противном случае используйте min_rank.

Итак, в моем df, глядя на вычисление первого ранга, просто для A:

df %>% select(name, A, A_rank) %>% arrange(A_rank)
           name  A A_rank
1   bell pepper 14      1
2  blood orange 14      1
3      bilberry 12      3
4        banana 11      4
5    blackberry 11      4
6     blueberry 11      4
7       apricot 10      7
8  blackcurrant  9      8
9         apple  8      9
10      avocado  7     10

Здесь, как только мы начали с первого ранга, плоды с привязанными баллами используют min_rank, чтоЭто нормально, так как больше нет информации.

После суммирования по строкам столбцов A и B:

df %>% select(name, A, B, AB_rank) %>% arrange(AB_rank)
           name  A B AB_rank
1   bell pepper 14 4       1
2  blood orange 14 2       2
3      bilberry 12 1       3
4    blackberry 11 2       3
5        banana 11 1       5
6     blueberry 11 1       5
7       apricot 10 1       7
8  blackcurrant  9 2       7
9         apple  8 1       9
10      avocado  7 0      10

Здесь для фруктов bilberry и blackberry,у каждого из них есть один столбец, в котором они имеют более высокое число, чем другие фрукты, поэтому связь все еще остается, и я хочу перейти ко второму правилу, где bilberry будет ранжировать 3, поскольку они имеют более высокое число 12 вA col, в то время как blackberry переходит в ранг 4.

Для banana и blueberry, потому что после применения моих двух правил ничья останется, используйте min_rank, что здесь хорошо.

Ожидаемый результат

           name  A B AB_rank
1   bell pepper 14 4       1
2  blood orange 14 2       2
3      bilberry 12 1       3
4    blackberry 11 2       4
5        banana 11 1       5
6     blueberry 11 1       5
7       apricot 10 1       7
8  blackcurrant  9 2       8
9         apple  8 1       9
10      avocado  7 0      10

Теперь, используя суммы A, B, C:

df %>% select(name, A, B, C, ABC_rank) %>% arrange(ABC_rank)
           name  A B C ABC_rank
1   bell pepper 14 4 7        1
2  blood orange 14 2 8        2
3    blackberry 11 2 8        3
4       apricot 10 1 7        4
5      bilberry 12 1 5        4
6  blackcurrant  9 2 7        4
7     blueberry 11 1 6        4
8         apple  8 1 8        8
9       avocado  7 0 8        9
10       banana 11 1 3        9

Фрукты apricot, bilberry, blackcurrant и blueberry имеют одинаковую сумму.Применяя первое правило, blueberry становится рангом 7, поскольку у них нет номера, которое является самым высоким в любом из трех столбцов A, B, C.Затем каждый из оставшихся трех плодов имеет наивысший балл, поэтому bilberry будет иметь ранг 4, так как фрукт имеет наивысшую цифру 12 в A, затем apricot с рангом 5, поскольку он имеет цифру 10затем черная смородина имеет ранг 6.

Если посмотреть на avocado и banana, banana будет 9-го ранга, поскольку они имеют два значения, которые больше avacado в столбцах A и B, в то время как авокадо станет 10-м рангом.

Ожидаемый результат

           name  A B C ABC_rank
1   bell pepper 14 4 7        1
2  blood orange 14 2 8        2
3    blackberry 11 2 8        3
4      bilberry 12 1 5        4
5       apricot 10 1 7        5
6  blackcurrant  9 2 7        6
7     blueberry 11 1 6        7
8         apple  8 1 8        8
9        banana 11 1 3        9
10      avocado  7 0 8        10

Это довольно сложно, и я не уверен, что лучшее решение для решенияэто.Возможно несколько утверждений если еще?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...