导致年龄DOB = 2月29日

时间:2013-03-18 21:00:55

标签: r

我正在寻找一种方法来推导出能够准确处理出生日期的年龄= 2月29日。我已尝试在new_interval包上使用lubridate功能,但对于2004年2月29日出生的孩子,这将在2006年2月28日返回2岁。孩子将在2006年3月1日2岁 我也尝试使用decimal_date函数,但是当date = 01-Jan-2006时,这会给我一个错误。

我正在使用R版本2.15.3(2013-03-01) - “安全毯” 这是我的代码:

library (lubridate)

MyTable <- data.frame(Eval.Date = c(as.Date("2006-01-01"), 
                                    as.Date(0:5, origin = "2006-02-26")),
                      Birth.Date = as.Date("2004-02-29"))

MyTable$Age <- floor(new_interval(MyTable$Birth.Date, MyTable$Eval.Date) / 
                     duration(num = 1, units = "years"))

MyTable$DecDate <- decimal_date(MyTable$Eval.Date)

MyTable[,c("Birth.Date","Eval.Date","Age","DecDate")]

输出:

  Birth.Date  Eval.Date Age  DecDate
1 2004-02-29 2006-01-01   1      NaN
2 2004-02-29 2006-02-26   1 2006.153
3 2004-02-29 2006-02-27   1 2006.156
4 2004-02-29 2006-02-28   2 2006.159
5 2004-02-29 2006-03-01   2 2006.162
6 2004-02-29 2006-03-02   2 2006.164
7 2004-02-29 2006-03-03   2 2006.167

帮助decimal_date或者年龄计算将受到赞赏 谢谢!

3 个答案:

答案 0 :(得分:5)

使用蛮力:

library(lubridate)

age <- function(ED, BD) {
    year(ED) - year(BD) - 1 +
    (month(ED) > month(BD) | 
       (month(ED) == month(BD) & day(ED) >= day(BD)))
}

transform(MyTable, age = age(Eval.Date, Birth.Date))
#    Eval.Date Birth.Date age
# 1 2006-01-01 2004-02-29   1
# 2 2006-02-26 2004-02-29   1
# 3 2006-02-27 2004-02-29   1
# 4 2006-02-28 2004-02-29   1
# 5 2006-03-01 2004-02-29   2
# 6 2006-03-02 2004-02-29   2
# 7 2006-03-03 2004-02-29   2

答案 1 :(得分:1)

2014年12月22日由Garrett Grolemund在CRAN上发布的新版本的lubridate版本1.3.3修复了此错误。

尝试:

install.packages("lubridate")  
library(lubridate)

MyTable <- 
  data.frame(Eval.Date = c(as.Date("2006-01-01"), 
                           as.Date(0:1, origin = "2006-02-28"),
                           as.Date(0:2, origin = "2008-02-28")),
             Birth.Date = as.Date("2004-02-29"))

MyTable$Eval.Date.dec <- decimal_date(MyTable$Eval.Date)
MyTable$Birth.Date.dec <- decimal_date(MyTable$Birth.Date)

MyTable$Age <- 
  floor(MyTable$Eval.Date.dec - MyTable$Birth.Date.dec)

MyTable[, c("Birth.Date", "Eval.Date", "Age", 
            "Birth.Date.dec", "Eval.Date.dec")]

输出:

  Birth.Date  Eval.Date Age Birth.Date.dec Eval.Date.dec  
1 2004-02-29 2006-01-01   1       2004.161      2006.000  
2 2004-02-29 2006-02-28   1       2004.161      2006.159  
3 2004-02-29 2006-03-01   2       2004.161      2006.162  
4 2004-02-29 2008-02-28   3       2004.161      2008.158  
5 2004-02-29 2008-02-29   4       2004.161      2008.161  
6 2004-02-29 2008-03-01   4       2004.161      2008.164  

答案 2 :(得分:0)

请注意,decimal_date中的错误现已修复,请参阅https://github.com/hadley/lubridate/issues/153