2015-08-31 11 views
7

Vorrei utilizzare lubridate per calcolare l'età in anni data la loro data di nascita e la data odierna. In questo momento ho questo:Differenza oraria negli anni con lubridate?

library(lubridate) 
today<-mdy(08312015) 
dob<-mdy(09071982) 
today-dob 

che mi dà la loro età in giorni.

+0

La divisione per 365.25 non è sufficientemente accurata? – lenz

+1

Divisione per 365.25. O forse usare 'year (today) -year (dob)'. Ma questo sottrae solo l'anno 1 meno l'anno 2. – phiver

+0

Sì, ma '(today-dob)/365.25' mi dà' Differenza di tempo di 32.98015 giorni' invece degli anni – Ignacio

risposta

8

Questo è l'approccio lubridate vorrei prendere:

new_interval(dob, today)/years(1) 

rendimenti la risposta di 32 anni.

Si noti che la funzione si lamenterà che non può esprimere il resto della frazione dell'anno. Questo perché l'anno non è un concetto fisso, vale a dire 366 anni bisestili e 365 anni non bisestili. È possibile ottenere una risposta con maggiori dettagli per quanto riguarda il numero di settimane e giorni:

interval_period = new_interval(dob, today) 
full_year = interval_period %/% years(1) 
remaining_weeks = interval_period %% years(1) %/% weeks(1) 
remaining_days = interval_period %% years(1) %% weeks(1) %/% days(1) 
sprintf('Your age is %d years, %d weeks and %d days', full_year, remaining_weeks, remaining_days) 
# [1] "Your age is 32 years, 51 weeks and 1 days" 

Nota che uso %/% per la divisione e %% come modulo per ottenere le rimanenti settimane/giorni dopo aver sottratto i pieni anni/settimane .

+0

Grazie, questo fa quello che voglio. Nota 'new_interval' è deprecato, usa' intervallo' invece –

+0

Nota anche 'new_interval' è deprecato; usa invece "intervallo". Obsoleto nella versione '1.5.0'. – amonk

+0

Qual è la differenza tra new_interval (dob, today) e dob-today e as.period (today - dob, unit = "years")? – skan

3

Questo darà un messaggio che è solo una stima perché non tiene conto della data di inizio esatta e della data di fine.

1
as.duration(interval(dob,today)) %/% as.duration(years(1)) 

dovrebbe fare il lavoro senza errori.

+1

Grazie per questo snippet di codice, che potrebbe fornire un aiuto immediato. Una spiegazione adeguata potrebbe [migliorare notevolmente] (https://meta.stackexchange.com/questions/114762/explaining-intlely-code-based-answers) il suo valore educativo mostrando perché questa è una buona soluzione al problema e renderlo più utile ai futuri lettori con domande simili, ma non identiche. Si prega di modificare la risposta per aggiungere una spiegazione e fornire un'indicazione di quali limitazioni e ipotesi si applicano. – basvk

Problemi correlati