У меня есть фрейм данных в 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-04-01 по 2015-04-10, потому что он полностью попадает в столбец dates
в моем фрейме данных date_data
. Затем каждый образец получит уникальное (ненулевое) число в столбце sample_id
в date_data
, например 1:10
.
Для ясности, мои требования:
Каждый образец будет 10 подряд дней.
Выборка должна быть без замены. Поэтому, если sample_id == 1
- период с 2015-04-01 по 2015-04-10, эти даты не могут быть частью другой 10-дневной выборки.
Каждый 10-дневный образец не может включать любую дату, которая не находится в пределах date_data$dates
.
В конце, date_data$sample_id
будет иметь уникальные числа, представляющие каждую 10-дневную выборку, вероятно, с большим количеством оставшихся 0
с, которые не были частью какой-либо выборки (и будет 200 строк - 10 для каждый образец - где sample_id != 0
).
Я знаю о dplyr::sample_n()
, но он не производит выборку последовательных значений, и я не знаю, как придумать способ "запомнить", какие даты уже были выбраны ...
Какой хороший способ сделать это? for
петля?!?! Или, может быть, что-то с purrr
? Большое спасибо за вашу помощь.
ОБНОВЛЕНИЕ: Благодаря решению @ gfgm, оно напомнило мне, что производительность является важным фактором. Мой реальный набор данных немного больше, и в некоторых случаях я хотел бы взять более 20 сэмплов вместо 10-ти. В идеале размер выборки также можно изменить, т. Е. Не обязательно 10-дневный.