Я работаю над проектом, который анализирует рентабельность инвестиций людей, участвующих во множестве конкурсов. Для каждого соревнования у меня есть таблица, которая имеет все ранги, и другая таблица, в которой выплачиваются выплаты за данный диапазон рангов. Я хочу объединить эти две таблицы, чтобы назначить каждому выплату в зависимости от их рейтинга, но у меня возникли проблемы с размышлениями о том, как справляться со связями. Если два человека связаны, то выплаты усредняются. Мои таблицы исчисляются сотнями тысяч, поэтому я хочу правильно описать процесс для этого меньшего примера.
Пример таблицы рейтинга:
id rank
1 A 1
2 B 1
3 C 3
4 D 4
5 E 4
6 F 4
7 G 7
8 H 8
9 I 9
10 J 10
Пример таблицы выплат:
rankMin rankMax payout
1 1 1 100
2 2 3 70
3 4 5 50
4 6 8 20
5 9 10 0
Конечная цель:
id rank payout
1 A 1 85 # Two people tied for first, so take average of 1st and 2nd payouts
2 B 1 85
3 C 3 70
4 D 4 40 # Three people tied for 4th, so take average of 4th/5th/6th payouts.
5 E 4 40
6 F 4 40
7 G 7 20
8 H 8 20
9 I 9 0
10 J 10 0
Мой код на данный момент:
# Load libraries
library(dplyr)
# Setup the rank table
id <- LETTERS[1:10]
rank <- c(1, 1, 3, 4, 4, 4, 7, 8, 9, 10)
finalStandingsDf <- data.frame(id, rank, stringsAsFactors = FALSE)
# Setup the payout table
rankMin <- c(1, 2, 4, 6, 9)
rankMax <- c(1, 3, 5, 8, 10)
payoutAmt <- c(100, 70, 50, 20, 0)
payoutDf <- data.frame(rankMin, rankMax, payoutAmt)
# "Unzip" the payout table to make it easier to join onto rank table
payoutsFixedAll <- data.frame()
for(i in 1:length(id)){
rank <- i
payoutIndex <- min(which(rank <= rankMax))
payout <- payoutDf[payoutIndex, 3]
payoutsFixed <- data.frame(rank, payout)
payoutsFixedAll <- rbind(payoutsFixedAll, payoutsFixed)
}
### Intermittent step to adjust the payoutsFixedAll table to account for ties ###
# Join onto rank table
rankPayoutDf <- finalStandingsDf %>%
left_join(payoutsFixedAll, by = c('rank'))
Очевидно, мне нужно внести некоторую корректировку в таблицу выплат, чтобы она корректировалась должным образом, но Я изо всех сил пытаюсь придумать лучший способ сделать это. Я думаю, что это будет включать подсчет числа каждого ранга (1: 2, 2: 0, 3: 1, 4: 3 и т. Д. c) и как-то оттуда делать корректировку? Я понимаю, что нужно сделать, я просто изо всех сил пытаюсь увидеть путь, чтобы добраться туда. Есть мысли?