Пусть лубридатное вычитание возвращает только числовое значение

У меня есть одна переменная с именем Started, которая является датой включения людей в исследование, и другая переменная с именем dos1, которая представляет собой дату, когда субъекту в последний раз была сделана операция. Я хочу выяснить, сколько месяцев прошло с момента последней операции до дня зачисления. Я пытался:

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

Я ожидал, что это даст мне что-то вроде:

14, 18, 1, 26 

Каждое число - это количество месяцев.

Вместо этого я получаю:

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.   

Как я могу получить только числовое значение месяцев?


person Farrel    schedule 22.09.2010    source источник


Ответы (3)


Вместо этого вы можете попробовать использовать difftime, то есть:

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

Обратите внимание, что это даст вам объект класса difftime, если вы хотите числовой вектор, оберните его as.numeric. Также обратите внимание, что вы не можете выбрать месяцы в качестве опции для единиц, но вам действительно следует придерживаться единицы времени, которая имеет фиксированную длину.

person James    schedule 22.09.2010
comment
В этом случае вы можете просто разделить полученный результат на 30,44. - person James; 22.09.2010
comment
difftime берется из базового пакета. Поскольку столбцы были Date, я также мог просто ввести syrrupan $ Started-syrrupan $ dos1, который создал вектор различия классов в днях. Кстати, синтаксис difftime не допускает знака минус, скорее, это должна быть просто запятая. Чтобы получить месяцы и иметь только одно значащее значение после десятичной дроби, я использовал round (as.numeric (difftime (syrrupan $ Started, syrrupan $ dos1, units = days)) / 30.44,1). В lubridate мне удалось выполнить этот раунд (as.numeric (as.duration (syrrupan $ Started-syrrupan $ dos1)) / 60/60/24 / 30.44,1), что кажется неуклюжим. - person Farrel; 22.09.2010
comment
Извините, да, знак минус закрался, когда я скопировал ваши имена переменных из вопроса. Я исправил ответ сейчас. - person James; 23.09.2010

Это определенно ошибка в lubridate. Я сделал отчет об ошибке и исправлю его для версии 0.1:

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

Спасибо, что обратили на это мое внимание.

person Garrett    schedule 22.09.2010

Как отмечено в R - lubridate - Преобразование периода в числовые месяцы подсчета предполагаемый метод lubridate здесь будет time_length

time_length(syrrupan$Started-syrrupan$dos1, unit="days")
person Holger Brandl    schedule 14.07.2020
comment
См. Также github.com/tidyverse/lubridate/issues/906. - person Holger Brandl; 14.07.2020