在日期后生成随机日期
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_entry
的 id
生成随机 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))
我有这样的数据集:
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_entry
的 id
生成随机 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))