在日期后生成随机日期

Generate random date after a date

我有这样的数据集:

set.seed(123)
date_entry<- sample(seq(as.Date('2000-01-01'), as.Date('2010-01-01'), by="day"), 1000)
df <- data.frame( date_entry)
df <- df %>% mutate(id = row_number())

我想为每个大于 date_entryid 生成随机 date_end 列。例如,对于这些日期,我希望 id=1:3 大于 2006 年,id=4 大于 2002 年。

    date_entry  id
1   2006-09-28   1
2   2006-11-15   2
3   2006-02-04   3
4   2001-06-09   4
5   2000-07-13   5

随机选择天数添加到每个date_entry。在这里,我在 1 到 100,000 天之间统一采样以添加 - 选择您想要的任何可能性/分布范围。

df %>%
  mutate(date_end = date_entry + sample(1:1e5, size = n(), replace = TRUE))
#     date_entry  id   date_end
# 1   2006-09-28   1 2104-02-13
# 2   2006-11-15   2 2199-06-24
# 3   2006-02-04   3 2042-08-30
# 4   2001-06-09   4 2153-04-10
# 5   2000-07-13   5 2140-04-28
# 6   2008-03-04   6 2106-07-06
# 7   2005-01-15   7 2169-06-14
# ...

如果您想确保 date_end 是在下一年(您的问题中可能有些暗示?),请在添加随机日期之前四舍五入:

df %>%
  mutate(date_end = 
    lubridate::ceiling_date(date_entry, unit = "year") + 
      sample(0:1e5, size = n(), replace = TRUE)
  )

date_entry 和今天的日期(即 Sys.Date())之间创建一个每日序列,然后为 date_end 选择 1 个样本。

library(tidyverse)

df %>% 
  rowwise %>% 
  mutate(date_end = sample(seq(date_entry, Sys.Date(), by="day"), 1))

输出

   date_entry    id date_end  
   <date>     <int> <date>    
 1 2006-09-28     1 2016-01-08
 2 2006-11-15     2 2019-04-27
 3 2006-02-04     3 2016-02-17
 4 2001-06-09     4 2012-12-26
 5 2000-07-13     5 2008-11-12
 6 2008-03-04     6 2011-12-27
 7 2005-01-15     7 2015-01-04
 8 2003-02-15     8 2020-07-28
 9 2009-03-24     9 2014-11-01
10 2003-06-06    10 2004-03-22
# … with 990 more rows

在函数 f 中,我们可以使用 as.POSIXlt 并将 1901 添加到 year 元素,它简单地产生明年,我们在其中创建 January 1 st 使用 ISOdate。转换后的 as.Date 我们添加一个从零到定义的 dmax 的随机整数,导致所需的随机日期开始不早于下一年。

f <- \(x, dmax=3652) with(as.POSIXlt(x), as.Date(ISOdate(year + 1901, 1, 1)) + 
                            sample(0:dmax, length(x), replace=TRUE))

set.seed(42)
transform(dat, date_end=f(date_entry))
#   date_entry id   date_end
# 1 2006-09-28  1 2014-02-21
# 2 2006-11-15  2 2013-06-26
# 3 2006-02-04  3 2010-03-22
# 4 2001-06-09  4 2005-01-02
# 5 2000-07-13  5 2004-06-05
# 6 2008-03-04  6 2017-10-23

数据:

dat <- structure(list(date_entry = structure(c(13419, 13467, 13183, 
11482, 11151, 13942), class = "Date"), id = 1:6), class = "data.frame", row.names = c(NA, 
-6L))