【发布时间】:2020-05-02 11:20:53
【问题描述】:
我有一个大型时间序列数据集,并希望根据我的一列中的值从每个日期中选择前 10 个观察值。
我可以使用 group_by(Date) %>% top_n(10)
做到这一点但是,如果第 10 次和第 11 次观察的值相等,那么它们都会被选中,所以我得到 11 个观察而不是 10 个。
有谁知道我可以做些什么来确保只选择 10 个观察值?
【问题讨论】:
我有一个大型时间序列数据集,并希望根据我的一列中的值从每个日期中选择前 10 个观察值。
我可以使用 group_by(Date) %>% top_n(10)
做到这一点但是,如果第 10 次和第 11 次观察的值相等,那么它们都会被选中,所以我得到 11 个观察而不是 10 个。
有谁知道我可以做些什么来确保只选择 10 个观察值?
【问题讨论】:
您可以arrange 数据并选择每组中的前 10 行。
library(dplyr)
df %>% arrange(Date, desc(col_name)) %>% group_by(Date) %>% slice(1:10)
同样,filter
df %>%
arrange(Date, desc(col_name)) %>%
group_by(Date) %>%
filter(row_number() <= 10)
【讨论】:
data.table 你可以做到
library(data.table)
setDT(df)
df[order(Date, desc(value))][, .SD[1:10], by = Date]
更改value 以匹配用于选择应保留的观察值以防出现平局的变量名称。你也可以这样做:
df[order(Date, desc(value))][, head(.SD,10), by = Date]
【讨论】:
我们可以使用base R
df1 <- df[with(df, order(Date, -value)),]
df1[with(df1, ave(seq_along(Date), Date, FUN = function(x) x %in% 1:10)),]
【讨论】: