【发布时间】:2018-09-12 03:56:27
【问题描述】:
以下是我的 dataframe/data.table 的样子。 rank 列是我的 desired 计算字段。
library(data.table)
df <- fread('
Name Score Date Rank
John 42 1/1/2018 3
Rob 85 12/31/2017 2
Rob 89 12/26/2017 1
Rob 57 12/24/2017 1
Rob 53 08/31/2017 1
Rob 72 05/31/2017 2
Kate 87 12/25/2017 1
Kate 73 05/15/2017 1
')
df[,Date:= as.Date(Date, format="%m/%d/%Y")]
我试图在 30 天的窗口内计算每个给定时间点数据中每个学生的排名。为此,我需要获取所有学生在给定时间点的最新分数,然后传递排名函数。
在第一行,截至1/1/2018,John 在过去 30 天的窗口中还有两个竞争对手:12/31/2017 中最近得分为 85 的 Rob 和最近得分为87 在 12/25/2017 中,这两个日期都在 1/1/2018 - 30 日窗口内。 John 的排名为 3,最低得分为 42。如果只有一名学生在date(at a given row) - 30 day window 范围内,则排名为 1。
第三行的日期是12/26/2017。所以 Rob 在12/26/2017 的分数是89。在12/26/2017 - 30 天的时间窗口内只有一个学生的案例,那就是 kate 在12/25/2017 上的最新分数(87)。所以在(12/26/2017) - 30 的时间窗口内,Rob 的89 得分高于Kate 的87 得分,因此Rob 的排名为1。
我一直在考虑使用 Efficient way to perform running total in the last 365 day window 此处的框架,但在使用排名之前很难想出一种方法来获取所有学生在给定时间点的所有最近分数。
【问题讨论】:
-
Rob 在 12/31 的得分也应该是 89,因此他在第 2 行排名第 1,对吧?
-
@Frank Hey Frank,我在想,截至 12/31,Rob 的最新分数是 85,仅次于 Kate 在 12/25 的 87(在 12/31 - 30 天)窗口)。
标签: r dplyr data.table rank