Как выбрать даты одного дня недели?

Учитывая образцы дат:

t_s<-seq(as.POSIXct("2010-01-01 00:00:00"), as.POSIXct("2010-12-31 23:00:00"), by = '1 day')

и вектор даты:

t<-seq(as.POSIXct("2010-02-01 00:00:00"), as.POSIXct("2010-2-10 23:00:00"), by = '1 day')

Теперь я хочу случайным образом выбрать даты в t_s с тем же днем ​​недели для элементов в t. Размер выборки должен быть 4 для каждого элемента t. Например, образцы для первого элемента "2010-02-01" могут быть "2010-06-28" "2010-5-31" "2010-8-02" "2010-10-04", потому что все они относятся к понедельнику.

Выбранные даты из t_s могут быть множественными, потому что некоторые даты в t имеют один и тот же день недели. Однако, если t_s намного меньше t (не в рассматриваемом случае), уникальность выборок не может быть достигнута. Следовательно, требуются примеры методов с множественными t_s датами и без них.

Как я мог получить эти образцы?


person YQ.Wang    schedule 29.12.2016    source источник
comment
Один из способов - n <- 4L;lapply(format(t, "%w"), function(wday) sample(t_s[wday==format(t_s, "%w")], n)). Хотя могут быть варианты получше.   -  person lukeA    schedule 29.12.2016
comment
Уточните, могут ли выбранные даты из t_s появляться для нескольких дат в t.   -  person nrussell    schedule 29.12.2016
comment
@nrussell Я отредактировал вопрос для уточнения.   -  person YQ.Wang    schedule 30.12.2016


Ответы (1)


Что-то вроде этого должно делать то, что вам нужно

Без замены

lapply(seq_along(t), function(x){
  sample(t_s[weekdays(t_s)==weekdays(t[x])], 4, replace = FALSE)
})

С заменой

lapply(seq_along(t), function(x){
  sample(t_s[weekdays(t_s)==weekdays(t[x])], 4, replace = TRUE)
})

Они возвращают список с вашими образцами

Исключение ранее выбранных дат

# Based on @lmo comment
ds <- c()
lapply(seq_along(t), function(x){
  if(x == 1){ result <- sample(t_s[weekdays(t_s)==weekdays(t[x])], 4)
} else {
  t_s2 <- t_s[!(t_s %in% ds)]
  result <- sample(t_s2[weekdays(t_s2)==weekdays(t[x])], 4)
}
ds <<- c(ds, result)
result
})
person dimitris_ps    schedule 29.12.2016
comment
Это может привести к тому, что одна и та же дата в t_s будет выбрана более одного раза для рабочих дней в t. Например, в т. Н. 2 понедельника. Не уверен, что OP хочет по этому поводу. - person lmo; 29.12.2016
comment
Правильно, но, как вы заявили, OP не указал этого. Я постараюсь обновить на этот случай - person dimitris_ps; 29.12.2016
comment
@imo Я отредактировал вопрос для уточнения. - person YQ.Wang; 30.12.2016