2013-03-18 79 views
7

我正在尋找一種方法來派生年齡將準確處理出生日期= 2月29日。我已經嘗試使用lubridate包裝上的new_interval功能,但是對於2004年2月29日出生的孩子,該功能在2006年2月28日將返回2歲。該孩子將於2006年3月1日兩歲。
我也試過使用decimal_date函數,但是當date = 01-Jan-2006時,這給我一個錯誤。派生年齡其中DOB = 2月29日

我,使用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

公約。在新西蘭,法律規定第二十八條適用於合法成年人。 (該軟件包的作者來自新西蘭) – mnel 2013-03-18 21:18:16

回答

1

lubridate的新版本,版本1.3.3 CRAN發表加勒特Grolemund上月2014年2月22日修正了這個錯誤。

嘗試:

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")] 

輸出:在什麼DOB將依國家而定

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 
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