用r语言根据年龄确定出生日期

3

给一个模拟样本分配出生日期;以下方法可行,但忽略了闰年。

想知道是否有更精确(且优雅)的R语言方法?

# Simulate 10 persons with age evenly distributed 0 to 21
age <- runif(10, 0, 21)
# calc age in seconds
agesecs <- age*365*24*60*60
# subtract from right now to establish 'birthdate'
bday <- as.Date(Sys.time() - agesecs)
bday
[1] "2008-03-28" "1998-06-12" "2010-05-02" "2007-01-11" "2007-06-07"
[6] "1999-05-22" "2004-01-29" "2013-03-29" "1998-06-01" "2006-10-14"

2
如果你使用365.25,那么会更加准确。 - IRTFM
看看这些链接是否有帮助,你可能需要找到一种“逆向工程”的方法来理解它们的作用。链接1 链接2 - phg
2
网络上充斥着那些没有正确计算日期的恐怖故事(更不用提所谓的“Y2K”了)。对于您的样例,只需将Sys.time转换为年-月-日-时-分-秒格式,然后将随机的“年份”转换为相同的格式,就可以使用内置的时间函数来获取出生日期。程序员的黄金法则:永远不要重新发明已经被其他人完成的函数。 - Carl Witthoft
DWin的解决方案对于我的目的来说确实快速且“足够好”。那个目的,回答Fernando的问题,是创建一组模拟记录,这些记录类似于实际记录集,但绝不是直接派生或掩码实际记录的结果。正是Carl的建议将我引向了解决方案的方向。 - Anthony Simon Mielniczuk
必须使用基本的R吗?可以使用lubridate包来解决。 - Victor HDC
1个回答

0

difftime 对象 在日期和时间算术方面表现得非常出色。问题在于,它识别的单位不包括年份。因此,我使用了周作为单位进行随机化,difftime 可以接受这个单位。

    # Simulate 10 persons with age evenly distributed 0 to 21 (use weeks)
    agewks <- runif(10, 0, (21*52))
    # convert to difftime object
    agedt <- as.difftime(agewks, units="weeks")
    # above could be combined into single step
    # agewks <- as.difftime(runif(10, 0, (21*52)), units='weeks')
    # subtract from right now to establish a 'birthdate' for our simulated persons
    bday <- as.POSIXct(Sys.time() - agedt)
    bday
    [1] "1997-05-26 13:23:07 EDT" "2003-02-24 13:07:48 EST"
    [3] "2006-12-20 12:38:04 EST" "2002-01-02 15:17:14 EST"
    [5] "1993-10-07 15:49:19 EDT" "2001-05-04 04:05:29 EDT"
    [7] "2003-09-28 09:35:30 EDT" "1996-05-17 20:58:15 EDT"
    [9] "2008-08-09 14:17:24 EDT" "2011-05-09 23:26:04 EDT"
    # to create a date object use
    bday <- as.Date(Sys.time() - agedt)

感谢Carl和其他人引导我到上述内容。欢迎提供替代和更好的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接