使用R和data.table

时间:2020-01-28 04:34:14

标签: r data.table

我正在处理R中可能发生联系的比赛结果。假设有两名玩家并列第三。他们将分享(3rd_prize + 4th_prize),每个人赚取(3rd_prize + 4th_prize)/ 2。如果有10位玩家并列第三名,他们会将第3位和第13位的和分,并且每人的总和超过10。

给出这种结构,并给出一个数据表,该表列出了所有玩家,他们的绝对成绩以及与之比赛的人数,我们如何生成关于每个人的奖金的专栏?我不知道如何在帖子中设置示例数据的格式,所以我将链接链接到包含示例数据和所需结果的google工作表!

https://docs.google.com/spreadsheets/d/1fLUZ172Sl_yXVQE3VI0Xo4wSr_SRvaL43MCZIMYen2w/edit?usp=sharing

1 个答案:

答案 0 :(得分:2)

这里有2个选项:

(1)

prizes[results[, rn:=.I], on=.(Position=rn)][,
    .(Person, Winnings=sum(Prize) / .N), .(Position=i.Position)]

说明:

  1. 使用results[, rn:=.I]为结果创建行索引序列
  2. 然后使用行索引prizes[results[, rn:=.I], on=.(Position=rn)]左联接此结果和奖金表
  3. 然后使用步骤2中的结果,按结果中的排名分组,并计算每个人的平均奖金(即[,.(Person, Winnings=sum(Prize) / .N), .(Position=i.Position)]

假设是results已按排名排序。

(2)

假设results中的每一行在prizes中的同一行中都有奖品,则可以在使用索引提取后计算出平均奖品:

results[, Winnings := sum(prizes$Prize[.I], na.rm=TRUE) / .N, Position]

输出:

    Position Person Winnings
 1:        1      A    100.0
 2:        2      B     50.0
 3:        3      C     17.5
 4:        3      D     17.5
 5:        4      E      5.0
 6:        5      F      4.0
 7:        6      G      3.0
 8:        7      H      1.0
 9:        7      I      1.0
10:        7      J      1.0

数据:

library(data.table)
results <- data.table(Person=LETTERS[1:10], 
    Position=c(1,2,3,3,4,5,6,7,7,7), 
    tied=c(1,1,2,2,1,1,1,3,3,3))
prizes <- data.table(Position=1:10, 
    Prize=c(100,50,25,10,5,4,3,2,1,0))
相关问题