Рейтинг игрока зависит от количества сыгранных игр - PullRequest
0 голосов
/ 31 марта 2020

У меня есть df игроков и их штрафные очки. Это выглядит примерно так:

# playerID  penalty 
#   A         0
#   B         2
#   A         4
#   C         2
#   A         0
#   B         0
#   B         2 

Я хочу получить «звание игрока», которое зависит от «штрафа» и количества сыгранных игр (три игры, C одна игра). Если есть игрок X со средним штрафом = 3 за 10 игр и игрок Y со средним штрафом = 3 за 4 игры, то «ранг игрока» игрока X должен быть ниже, чем «ранг игрока» игрока Y.

Моя идея состояла в том, чтобы разделить средний штраф игрока i на sqrt (n (i)), где n (i) - количество игр, в которые играл игрок i. Вторая идея состояла в том, чтобы разделить средний штраф на log (n (i) +1).

Как вы думаете, это правильный подход? Кто-нибудь сталкивался с подобной проблемой?

Спасибо за ваши ответы.

1 Ответ

0 голосов
/ 31 марта 2020

Я думаю, вы хотите перенести это сообщение на Перекрестная проверка . В любом случае, это решение вашей проблемы через data.table .

library(data.table)
df = data.frame( playerID = c( "A", "B", "A", "C", "A", "B", "B"),  
                 penalty = c( 0, 2, 4, 2, 0, 0, 2 ) )

setDT(df)

df[ , games := .N, by = playerID ]
df[ , mean_penalty := mean( penalty ), by = playerID ]
df[ , `:=` ( rank1 = mean_penalty / sqrt(games),
             rank2 = mean_penalty /  log(games+1) ) ]
final = unique(df, by = "playerID" )

> final
   playerID penalty games mean_penalty     rank1     rank2
1:        A       0     3     1.333333 0.7698004 0.9617967
2:        B       2     3     1.333333 0.7698004 0.9617967
3:        C       2     1     2.000000 2.0000000 2.8853901
...