我正在寻找一种方法来推导出能够准确处理出生日期的年龄= 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
或者年龄计算将受到赞赏
谢谢!
答案 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