我有一个df球员及其罚分。看起来像这样:
# playerID penalty
# A 0
# B 2
# A 4
# C 2
# A 0
# B 0
# B 2
我想获得一个“玩家排名”,该排名取决于“罚分”和所打游戏的数量(A为三局,C为一局)。如果存在10个游戏中平均罚分= 3的玩家X和4个游戏中平均罚分= 3的玩家Y,则玩家X的“玩家等级”应低于玩家Y的“玩家等级”。 / p>
我的想法是将玩家i的平均罚分除以sqrt(n(i)),其中n(i)是玩家i玩的游戏数。第二个想法是将平均罚分除以log(n(i)+1)。
您认为这是正确的方法吗?有人在处理类似的问题吗?
感谢您的回复。
答案 0 :(得分:0)
我认为您想将此帖子转移到Cross Validated。无论如何,这是通过 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