我正在尝试选择/过滤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个(比如说)最新值?
答案 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