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

2014年12月22日にGarrettGrolemundによって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

のバグが修正されたことに注意してください。https://github.com/hadley/lubridate/issues/153decimal_dateを参照してください。

于 2014-08-26T22:15:27.220 に答える