2016-07-31 20 views
0

Verwenden Sie Lubridate Paket, wie kann ich das numerische Alter zwischen zwei Zeiten, unter Berücksichtigung von Schaltjahren bestimmen.R lubridate, Berechnen Alter einschließlich Schaltjahren

Ich brauche eine Funktion, wo der Benutzer angeben kann, ob das Alter in allen verschiedenen Einheiten sein soll, zB 'Millisekunden', 'Sekunden', 'Minuten', 'Wochen', 'Monate' und 'Jahre' .

Hier ist eine Darstellung von dem, was ich bisher bekommen habe:

age <- function(from, to = today(), units = "years", floor = FALSE) { 
    calc = interval(from,to)/duration(num = 1, units = units) 
    if (floor) calc = as.integer(floor(calc)) 
    calc 
} 

Das Jahr 2016 ist ein Schaltjahr, läßt das Alter zwischen Start- und Endzeiten in dem Monat Juni bestimmen. Es sollte 30 Tage sein.

require(lubridate) 
#Consider month of June 2016, known to have 30 days 
from  = as.POSIXct("2016-6-1") 
to   = from + months(1) 

daysInYear = 365 + leap_year(to) 
age(from,to,units='days')    #30.00, CORRECT 
age(from,to,units='years')*daysInYear #30.08, INCORRECT 
age(from,to,units='years')*365  #30.00, CORRECT ANSWER, WRONG DAYS IN YEAR 

Wenn ich das gleiche Intervall in "Jahren berechnen, gibt sie: 0.08219178, die nicht korrekt ist, da die Dauer Divisor in der Alters Funktion wird nicht für das Jahr 2016 entfallen ein Schaltjahr ist, ich es brauchen Berechne 0.08196721, was der gleiche Wert multipliziert mit (365/366) ist.

Gibt es einen einfacheren Weg, um das genaue numerische Alter zwischen zwei Daten zu bestimmen, Schaltjahre zu berücksichtigen und die vollständige Angabe von Intervalleinheiten zuzulassen?

+0

'diff.Date' für Schaltjahre bilanzieren soll. Wo ist Ihr Beweis, dass es nicht so ist? –

+0

Ein anderer Betrogener: [Wie man eine Spalte vom Geburtsdatum zum Alter in R ändert?] (Http://stackoverflow.com/q/27096485/903061) – Gregor

+0

Im nicht verwendenden diff.Date, Beweis ist in meinen Beispielen oben. –

Antwort

0
is.leapyear=function(year){ 
    #http://en.wikipedia.org/wiki/Leap_year 
    return(((year %% 4 == 0) & (year %% 100 != 0)) | (year %% 400 == 0)) 
} 

age.hackr <- 
      function(from, to = today(), units = "years", floor = FALSE) { 
       if(is.leapyear(year(to))){ 
       calc = interval(from,to)/duration(num = 1, units = units) 
       if (floor) calc = as.integer(floor(calc)) 
       calc <- calc - 0.00022457 
       calc 
       } else{ 
       calc = interval(from,to)/duration(num = 1, units = units) 
       if (floor) calc = as.integer(floor(calc)) 
       calc 
       } 
      } 

age.hackr(from, to, units = "years") * 366 

[1] 30

+0

Da wir 'lubridate' trotzdem verwenden, können Sie' lubridate :: leap_year() 'verwenden. Es ist identisch mit Ihnen, aber mit einigen Eingangsprüfung. – Gregor