如何在R中的每个组中选择“x”最近的值?

时间:2015-08-31 10:52:21

标签: r greatest-n-per-group

我正在尝试选择/过滤R中数据框中每个组中的最新值。例如,我想从每个名称组中选择最近的3个(即最接近今天的日期)以下数据框:

Player  Date    Result
 Sam    03/15/2015  1
 Sam    03/22/2015  0
 Sam    04/04/2015  2
 Sam    04/12/2015  1
 Sam    04/18/2015  1
 Sam    04/26/2015  0
 Sam    08/08/2015  3
Steve   02/17/2015  0
Steve   02/21/2015  0
Steve   03/04/2015  4
Steve   03/11/2015  2
Steve   03/15/2015  1
Steve   03/22/2015  0
Steve   04/12/2015  0
Steve   04/18/2015  2
Steve   04/26/2015  1
Steve   04/29/2015  2
Steve   08/16/2015  4
Jasper  03/15/2015  3
Jasper  03/22/2015  3.5
Jasper  04/04/2015  4
Jasper  04/12/2015  4
Jasper  04/18/2015  5
Jasper  04/26/2015  0

我已编写as.date()代码,因此R现在了解日期格式,但我现在可以使用哪些代码来仅选择每组中的3个(比如说)最新值?

1 个答案:

答案 0 :(得分:3)

我们可以使用dplyr。我们使用Date将“日期”转换为as.Date类。在按“播放器”进行分组后,我们{'1}}'日期'列下降并使用arrange获取最新的3个值。如果我们不想更改“日期”类,我们可以删除slice步骤并在mutate内进行转换,即arrange

arrange(desc(as.Date(Date, '%m/%d/%Y')))

或者在我们按“播放器”分组后,我们可以使用library(dplyr) df1 %>% mutate(Date=as.Date(Date, '%m/%d/%Y')) %>% group_by(Player) %>% arrange(desc(Date)) %>% slice(1:3) # Player Date Result #1 Jasper 2015-04-26 0 #2 Jasper 2015-04-18 5 #3 Jasper 2015-04-12 4 #4 Sam 2015-08-08 3 #5 Sam 2015-04-26 0 #6 Sam 2015-04-18 1 #7 Steve 2015-08-16 4 #8 Steve 2015-04-29 2 #9 Steve 2015-04-26 1 指定'n'和'wt'变量进行排序。

top_n

使用 df1 %>% mutate(Date=as.Date(Date, '%m/%d/%Y')) %>% group_by(Player) %>% top_n(n = 3, Date) # Player Date Result #1 Sam 2015-04-18 1 #2 Sam 2015-04-26 0 #3 Sam 2015-08-08 3 #4 Steve 2015-04-26 1 #5 Steve 2015-04-29 2 #6 Steve 2015-08-16 4 #7 Jasper 2015-04-12 4 #8 Jasper 2015-04-18 5 #9 Jasper 2015-04-26 0 ,我们将'data.frame'转换为'data.table'(data.table)。由“播放器”分组,我们setDT(df1)转换为order课后的“日期”,并使用Date我们可以获得每组的前3行。

head

数据

library(data.table)
setDT(df1)[order(-as.IDate(Date, '%m/%d/%Y')),head(.SD, 3) , by = Player]
#   Player       Date Result
#1:  Steve 08/16/2015      4
#2:  Steve 04/29/2015      2
#3:  Steve 04/26/2015      1
#4:    Sam 08/08/2015      3
#5:    Sam 04/26/2015      0
#6:    Sam 04/18/2015      1
#7: Jasper 04/26/2015      0
#8: Jasper 04/18/2015      5
#9: Jasper 04/12/2015      4