Skip to content

Turn dates into age

8 messages · jim holtman, frenchcr, Marc Schwartz +2 more

#
Ive got a big column of dates (also some fields dont have a date so they
have NA instead),
that i have converted into date format as so...


dates<-as.character(data[,"date_commissioned"]); # converted dates to
characters
dates[1:10]
[1] "19910101" "19860101" "19910101" "19860101" "19910101" "19910101"
"19910101" "19910101" "19910101" "19910101"

dateObs <- as.Date(dates,format="%Y%m%d")
dateObs[1:10]
[1] "1991-01-01" "1986-01-01" "1991-01-01" "1986-01-01" "1991-01-01"
"1991-01-01" "1991-01-01" "1991-01-01" "1991-01-01" "1991-01-01"



Now i need to turn the dates into years, how do i do it? Im not worried
about fractions of years, whole years would do.
#
What is the frame of reference to determine the age?   Check out 'difftime'.
On Sun, Nov 8, 2009 at 1:50 PM, frenchcr <frenchcr at btinternet.com> wrote:

  
    
#
it sure does thank you!
[1] 19 15  9

        
On Sun, Nov 8, 2009 at 2:44 PM, <frenchcr at btinternet.com> wrote:

        
jholtman wrote:

  
    
#
why do you use 365.25?


dates<-as.character(data[,"date_commissioned"]); # convert dates to
characters
#dates[1:10]
#[1] "19910101" "19860101" "19910101" "19860101" "19910101" "19910101"
"19910101" "19910101" "19910101" "19910101"

dateObs <- as.Date(dates,format="%Y%m%d")
#dateObs[1:10]
#[1] "1991-01-01" "1986-01-01" "1991-01-01" "1986-01-01" "1991-01-01"
"1991-01-01" "1991-01-01" "1991-01-01" "1991-01-01" "1991-01-01"

today <- Sys.Date()
x.date <- as.Date(dateObs, format="%Y%m%d")

AGE <- round(as.vector(difftime(today , x.date, units='day') / 365.25))
frenchcr wrote:

  
    
#
As Jim has noted, if the dates you have below are an 'end date', you  
need to define the time0 or start date for each to calculate the  
intervals. On the other hand, are the dates you have below the start  
dates and you need to calculate the time to today? In the latter case,  
see ?Sys.Date to get the current system date from your computer.

Generically speaking you can use the following:

(EndDate - StartDate) / 365.25

where EndDate and StartDate are of class Date. This will give you the  
time interval in years plus any fraction.

You can then use round() which will give you a whole year with typical  
rounding up or down to the nearest whole integer. You can use floor(),  
which will give you the nearest whole integer less than the result or  
basically a round down result. Keep in mind that the above calculation  
does not honor a calendar year, but is an approximation.

If you want to calculate age in years as we typically think of it  
using the calendar, you can use the following, where DOB is the Date  
of Birth (Start Date) and Date2 is the End Date:

# Calculate Age in Years
# DOB: Class Date
# Date2: Class Date

Calc_Age <- function(DOB, Date2)
{
   if (length(DOB) != length(Date2))
     stop("length(DOB) != length(Date2)")

   if (!inherits(DOB, "Date") | !inherits(Date2, "Date"))
     stop("Both DOB and Date2 must be Date class objects")

   start <- as.POSIXlt(DOB)
   end <- as.POSIXlt(Date2)

   Age <- end$year - start$year

   ifelse((end$mon < start$mon) |
          ((end$mon == start$mon) & (end$mday < start$mday)),
          Age - 1, Age)
}


HTH,

Marc Schwartz
On Nov 8, 2009, at 1:30 PM, jim holtman wrote:

            
#
On Nov 8, 2009, at 3:11 PM, frenchcr wrote:

            
As opposed to what?

--  
David
David Winsemius, MD
Heritage Laboratories
West Hartford, CT
#
[1] "2009-11-08"

 > as.Date("05/29/1971", format = "%m/%d/%Y")
[1] "1971-05-29"


 > as.numeric((Sys.Date() - as.Date("05/29/1971", format = "%m/%d/ 
%Y")) / 365.25)
[1] 38.44764

or perhaps more clearly:

EndDate <- Sys.Date()
StartDate <- as.Date("05/29/1971", format = "%m/%d/%Y")

 > as.numeric((EndDate - StartDate) / 365.25)
[1] 38.44764



We coerce to numeric here, to return a standard numeric value, rather  
than the result being of class difftime with an attribute of 'days'  
for units:

 > str((Sys.Date() - as.Date("05/29/1971", format = "%m/%d/%Y")) /  
365.25)
Class 'difftime'  atomic [1:1] 38.4
   ..- attr(*, "units")= chr "days"



HTH,

Marc Schwartz
On Nov 8, 2009, at 5:22 PM, Jim Burke wrote: