Пример 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
Это довольно сложно, и я не уверен, что лучшее решение для решенияэто.Возможно несколько утверждений если еще?