【问题标题】:Rank computation considering time stamp in grouped data考虑分组数据中时间戳的秩计算
【发布时间】:2020-07-15 10:13:18
【问题描述】:

在我的游戏数据集中,我对几个游戏玩家在多个时间点进行了观察。对于每次观察,我想根据此时点数与其他玩家的点数相比,计算该玩家的排名。因此,它必须将本次观察的该玩家的分数与所有其他玩家在他们最后一次(或过去最接近或恰好在同一秒)观察其他每个用户时的分数数进行比较。

包含预期排名的示例数据:

da = data.frame(player = c(1,1,1,2,2,2,3,3,3), date_sec = c(1451665633,1451665693,1451665721,1451665627,1451665692,1451665738,1451665626,1451665684,1451665765), points = c(100,150,200,130,140,230,80,90,100), rank = c(2,1,1,1,1,1,1,3,3))

da
  player   date_sec points rank
1      1 1451665633    100    2
2      1 1451665693    150    1
3      1 1451665721    200    1
4      2 1451665627    130    1
5      2 1451665692    140    1
6      2 1451665738    230    1
7      3 1451665626     80    1
8      3 1451665684     90    3
9      3 1451665765    100    3

例如,玩家 2 在 date_sec 1451665738 排名 1,因为此时没有其他玩家获得更多积分。

我知道如何在组内排名,但我没有找到一种方法来在这里考虑确切的时间点。一种方法是从时间戳中提取日期并按日期和玩家分组,但这并不像我想要的那样准确,因为排名可以在一天内更改多次。

library(dplyr)

da2 = mutate(da, day = as.Date(as.POSIXct(date_sec, origin="1970-01-01"))) %>%
   group_by(player, day) %>%
   mutate(my_ranks = order(order(points, day, decreasing=TRUE)))

da2

A tibble: 9 x 6
# Groups:   player, day [3]
  player   date_sec points  rank day        my_ranks
   <dbl>      <dbl>  <dbl> <dbl> <date>        <int>
1      1 1451665633    100     2 2016-01-01        3
2      1 1451665693    150     1 2016-01-01        2
3      1 1451665721    200     1 2016-01-01        1
4      2 1451665627    130     1 2016-01-01        3
5      2 1451665692    140     2 2016-01-01        2
6      2 1451665738    230     2 2016-01-01        1
7      3 1451665626     80     3 2016-01-01        3
8      3 1451665684     90     3 2016-01-01        2
9      3 1451665765    100     3 2016-01-01        1

在排名旁边,我还想根据点数得出一个百分位排名,因为在不同的时间段内活跃的玩家数量不同。

有人有想法吗?

【问题讨论】:

    标签: r dplyr panel rank percentile


    【解决方案1】:

    首先,我会使用complete,这样每个player/date_sec 组合都有一行。这样可以更轻松地对每个时间点进行比较。

    接下来,我将使用fill 来结转每个玩家的最新得分。在此之前应对分数进行排序/排列。

    然后,既然你有每个时间戳的分数,你可以group_by(date_sec)并在每个时间排序玩家进行排名。

    最后,您可以重新加入原始数据框以提供所需的排名。

    library(tidyverse)
    
    da %>%
      complete(player, date_sec) %>%
      group_by(player) %>%
      arrange(date_sec) %>%
      fill(points) %>%
      group_by(date_sec) %>%
      mutate(my_ranks = order(order(points, decreasing = TRUE))) %>%
      right_join(da)
    

    输出

    Joining, by = c("player", "date_sec", "points", "rank")
    # A tibble: 9 x 5
    # Groups:   date_sec [9]
      player   date_sec points  rank my_ranks
       <dbl>      <dbl>  <dbl> <dbl>    <int>
    1      1 1451665633    100     2        2
    2      1 1451665693    150     1        1
    3      1 1451665721    200     2        1
    4      2 1451665627    130     1        1
    5      2 1451665692    140     2        1
    6      2 1451665738    230     1        1
    7      3 1451665626     80     3        1
    8      3 1451665684     90     3        3
    9      3 1451665765    100     3        3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-10
      • 2014-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-21
      • 1970-01-01
      • 2012-02-18
      相关资源
      最近更新 更多