25

I have one variable called Started which is the date on which human subjects enrolled in a study and another variable called dos1 which is the date upon which the subject last had surgery. I want to work out how many months since their last surgery to the day of enrollment. I tried:

as.period(syrrupan$Started-syrrupan$dos1,units=c("month"))

I expected this to give me something like:

14, 18, 1, 26 

With each number being the number of months.

Instead I get:

1 year, -4 months, -5 days and -1 hours   1 year, -5 months, -23 days and -1 hours   1 year, -7 months, 2 days and -1 hours   1 year, -8 months, -28 days and 1 hour   1 year, -7 months, -23 days and 1 hour.   

How can I get just the numeric value of months?

Sam Firke
  • 21,571
  • 9
  • 87
  • 105
Farrel
  • 10,244
  • 19
  • 61
  • 99

3 Answers3

36

You could try using difftime instead, ie:

difftime(syrrupan$Started,syrrupan$dos1,units="days")

Note that this will give you an object of class difftime, if you want a numeric vector, wrap an as.numeric around it. Note also that you can't choose months as an option for units, but you should really stick with a time unit that has a fixed length.

James
  • 65,548
  • 14
  • 155
  • 193
  • 2
    In that case you could just divide the above result by 30.44. – James Sep 22 '10 at 11:28
  • difftime is from the base package. Since the columns were "Date" I was also able to simply enter syrrupan$Started-syrrupan$dos1 which created a vector of class "difftime" in days. By the way, the syntax of difftime does not permit the minus sign, rather it should be just a comma. To get months and to have just one significant value after the decimal I used round(as.numeric(difftime(syrrupan$Started,syrrupan$dos1,units="days"))/30.44,1). In lubridate I was able to do this round(as.numeric(as.duration(syrrupan$Started-syrrupan$dos1))/60/60/24/30.44,1) which seems clunky. – Farrel Sep 22 '10 at 17:15
  • Sorry, yes the minus sign crept in when I copied your variable names from the question. I've fixed the answer now. – James Sep 23 '10 at 09:25
  • Didn't help when I needed a difference in years. See `time_length()` instead, as suggested below. – Megatron Nov 20 '21 at 04:09
11

As noted in R - lubridate - Convert Period into numeric counting months the intended lubridate method here would be time_length

time_length(syrrupan$Started-syrrupan$dos1, unit="days")
Holger Brandl
  • 10,634
  • 3
  • 64
  • 63
7

That's definitely a bug in lubridate. I've made an error report and will fix it for version 0.1:

http://github.com/hadley/lubridate/issues#issue/75

Thanks for bringing it to my attention.

Garrett
  • 191
  • 1