【问题标题】:How to sample dates of the same weekday?如何采样同一工作日的日期?
【发布时间】:2017-05-13 21:31:03
【问题描述】:

考虑日期样本:

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 中元素的同一工作日。每个 t 元素的样本大小应为 4。 例如,第一个元素 "2010-02-01" 的样本可能是 "2010-06-28" "2010-5-31" "2010-8-02" "2010-10-04",因为它们都是星期一。

t_s 中的采样日期可能是多重的,因为t 中的某些日期共享同一工作日。但是,如果t_st 小很多(不是在示例情况下),则无法满足样本的唯一性。因此,需要有和没有多重t_s 日期的示例方法。

我怎样才能得到这些样品?

【问题讨论】:

  • 一种方法是n &lt;- 4L;lapply(format(t, "%w"), function(wday) sample(t_s[wday==format(t_s, "%w")], n))。不过可能有更好的选择。
  • 请说明来自t_s 的采样日期是否可以出现在t 中的多个日期。
  • @nrussell 我已经编辑了问题以进一步澄清。

标签: r date time weekday


【解决方案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
})

【讨论】:

  • 这可能导致 t_s 中的同一日期在 t 中的工作日被多次选择。例如,t 中有 2 个星期一。不确定 OP 对此有何要求。
  • 正确,但正如您所说,OP 没有指定这一点。我会尝试更新这个案例
  • @imo 我已经编辑了问题以进一步澄清。
猜你喜欢
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2013-09-07
  • 1970-01-01
  • 2018-10-26
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多