Соединение таблиц в R с поправкой на «связи» - PullRequest
1 голос
/ 05 апреля 2020

Я работаю над проектом, который анализирует рентабельность инвестиций людей, участвующих во множестве конкурсов. Для каждого соревнования у меня есть таблица, которая имеет все ранги, и другая таблица, в которой выплачиваются выплаты за данный диапазон рангов. Я хочу объединить эти две таблицы, чтобы назначить каждому выплату в зависимости от их рейтинга, но у меня возникли проблемы с размышлениями о том, как справляться со связями. Если два человека связаны, то выплаты усредняются. Мои таблицы исчисляются сотнями тысяч, поэтому я хочу правильно описать процесс для этого меньшего примера.

Пример таблицы рейтинга:

   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) и как-то оттуда делать корректировку? Я понимаю, что нужно сделать, я просто изо всех сил пытаюсь увидеть путь, чтобы добраться туда. Есть мысли?

1 Ответ

3 голосов
/ 05 апреля 2020

Для этого конкретного набора данных мы можем 1) сделать выплату для каждого рейтинга в payoutDf, а затем 2) усреднить выплаты на основе рейтинга finalStandingsDf.

payouts = with(payoutDf, rep(payoutAmt, rankMax - rankMin + 1)) 
finalStandingsDf$payout <- ave(payouts, finalStandingsDf[["rank"]])
finalStandingsDf

   id rank payout
1   A    1     85
2   B    1     85
3   C    3     70
4   D    4     40
5   E    4     40
6   F    4     40
7   G    7     20
8   H    8     20
9   I    9      0
10  J   10      0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...