2013-03-18 16 views
7

Ich bin auf der Suche nach einer Methode, um Alter abzuleiten, die genau mit dem Geburtsdatum = 29. Februar. Ich habe versucht, die new_interval Funktion auf dem lubridate Paket zu verwenden, aber für ein Kind geboren am 29.02.2004, gibt es am 28.02.2006 ein Alter von 2 Jahren. Das Kind wäre am 01. März 2006 2 Jahre alt.
Ich habe auch versucht, mit der decimal_date Funktion, aber das gibt mir einen Fehler, wenn Datum = 01-Jan-2006.Ableiten Alter, wo Geburtsdatum = 29. Februar

Ich bin mit R-Version 2.15.3 (2013.03.01) - "Sicherheit Blanket"
Hier ist mein Code:

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

Ausgang:

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 

Hilfe entweder mit decimal_date oder die Altersberechnung wird geschätzt.
Danke!

+3

Konventionen auf, was die dob wäre ist länderabhängig. In Neuseeland ist gesetzlich festgelegt, dass der 28. zur legalen Erwachsenwerdung verwendet wird. (Der Autor des Pakets stammt aus NZ) – mnel

Antwort

1

Die neue Version von lubridate, Version 1.3.3 auf CRAN veröffentlicht von Garrett Grolemund am Dezember 22, 2014 hat diesen Fehler behoben.

Versuchen:

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

Ausgang:

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

Mit roher Gewalt:

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