从r中的年龄确定出生日期

从r中的年龄确定出生日期,r,date-arithmetic,R,Date Arithmetic,为模拟样本指定出生日期;以下是有效的,但忽略了闰年 想知道是否有更精确(和优雅)的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.Da

为模拟样本指定出生日期;以下是有效的,但忽略了闰年

想知道是否有更精确(和优雅)的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"
#模拟10个年龄平均分布在0到21岁之间的人

年龄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)
#模拟10名年龄平均分布在0到21岁之间的人(使用周)

agewks如果你使用365.25会更准确。如果这些链接有帮助,你可能需要找到一种方法来“反向工程”它们所做的事情。网络上充斥着人们不正确计算日期的恐怖故事(更不用说“Y2K”了)。对于您的示例,只需将
Sys.time
转换为年-月-日-小时-分钟-秒格式,然后将随机“年”转换为相同格式,您就可以使用内置的时间函数来获取生日。程序员的规则编号[某件事]:永远不要重新发明一个肯定是别人以前做过的函数。对于我来说,德温的解决方案肯定很快而且“足够好”。为了回答费尔南多的问题,这个目的是创建一组模拟的记录,这些记录与实际记录相似,但不能直接导出,也不能由实际记录的掩码生成。是卡尔的建议让我找到了一个解决方案。它必须是base R吗?可以使用lubridate包制作解决方案