7

我正在寻找一种方法来得出年龄,以准确处理出生日期 = 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或年龄计算将不胜感激。
谢谢!

4

3 回答 3

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
于 2013-03-18T21:11:43.213 回答
1

Garrett Grolemund 于 2014 年 12 月 22 日在 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  
于 2015-01-21T02:04:38.327 回答
0

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

于 2014-08-26T22:15:27.220 回答