【发布时间】:2019-06-10 19:45:24
【问题描述】:
我在 R 中有一个包含一系列日期的数据框。最早的日期是(ISO 格式)2015-03-22,最晚的日期是 2016-01-03,但数据中有两次中断。这是它的样子:
library(tidyverse)
library(lubridate)
date_data <- tibble(dates = c(seq(ymd("2015-03-22"),
ymd("2015-07-03"),
by = "days"),
seq(ymd("2015-08-09"),
ymd("2015-10-01"),
by = "days"),
seq(ymd("2015-11-12"),
ymd("2016-01-03"),
by = "days")),
sample_id = 0L)
即:
> date_data
# A tibble: 211 x 2
dates sample_id
<date> <int>
1 2015-03-22 0
2 2015-03-23 0
3 2015-03-24 0
4 2015-03-25 0
5 2015-03-26 0
6 2015-03-27 0
7 2015-03-28 0
8 2015-03-29 0
9 2015-03-30 0
10 2015-03-31 0
# … with 201 more rows
我想要做的是从那个时间序列中获取十个 10 天的连续日期样本,没有替换。例如,一个有效的样本是从 2015 年 4 月 1 日到 2015 年 4 月 10 日的十天,因为这完全属于我的 date_data 数据框中的 dates 列。然后,每个样本将在date_data 的sample_id 列中获得一个唯一(非零)数字,例如1:10。
明确地说,我的要求是:
每个样本将是 10 连续天。
采样必须没有替换。因此,如果
sample_id == 1是 2015-04-01 到 2015-04-10 期间,则这些日期不能成为另一个 10 天样本的一部分。每个 10 天的样本不能包含不在
date_data$dates范围内的任何日期。
最后,date_data$sample_id 将有代表每个 10 天样本的唯一编号,可能还有很多 0s 不属于任何样本(并且将有 200 行 - 10 用于每个样本 - sample_id != 0)。
我知道dplyr::sample_n(),但它不会对 连续 值进行采样,而且我不知道如何设计一种方法来“记住”哪些日期已经被采样...
有什么好的方法可以做到这一点? for 循环?!?!或者可能是purrr?非常感谢您的帮助。
更新:感谢@gfgm 的解决方案,它提醒我性能是一个重要的考虑因素。我的真实数据集要大得多,在某些情况下,我希望采集 20 多个样本而不是 10 个。理想情况下,样本的大小也可以更改,即不一定要 10 天。
【问题讨论】:
标签: r random time-series sample lubridate