2016-05-26 4 views
1

У меня есть ниже набор данных, и я хотел бы вычислить месяц интервал для каждой строки (в том числе стартового месяца и конец месяца)Как рассчитать интервал месяца в наборе данных?

month1 <- c("Jul-96","Aug-96","Sep-96") 
month2 <- c("Jul-97","Sep-97","Nov-97") 

data <- as.data.frame(cbind(month1,month2)) 

Я хотел бы результаты, чтобы быть набор данных, как показано ниже.:

month1 month2 interval 
Jul-96 Jul-97 13 
Aug-96 Sep-97 14 
Sep-96 Nov-97 15 

спасибо.

+0

Что вы попробовали? это поможет http://stackoverflow.com/questions/13287798/calculating-days-per-month-between-interval-of-two-dates?rq=1 fyi вы можете создать 'data' просто с' data.frame (month1 = c («Jul-96», «Aug-96», «Sep-96»), month2 = c («Jul-97», «Sep-97», «Nov-97»)) ' – rawr

+0

Я пробовал это, но кажется, что я не мог вычислить его в наборе данных. Спасибо – cyrusjan

ответ

0

Мы могли бы сделать это путем преобразования в yearmonclass из zoo и получить разницу

library(zoo) 
12*(as.yearmon(data$month2, '%b-%y')-as.yearmon(data$month1, '%b-%y'))+1 
#[1] 13 14 15 

Или с помощью lapply для цикла по столбцам, преобразовать в yearmon класса, получить разность соответствующих значений в list элементов с Reduce, возьмите абсолютную (в случае ее отрицательной) и выполните арифметику, как указано выше.

abs(Reduce(`-`,lapply(data, as.yearmon, format = '%b-%y')))*12 + 1 
#[1] 13 14 15 
+1

Спасибо. Помогает – cyrusjan

1

Это не слишком красиво, но путем преобразования в объект as.POSIXlt даты и времени, вы можете сделать несколько простых сумм:

with(
    lapply(data, function(x) as.POSIXlt(paste0("01-", x), format="%d-%b-%y", tz="UTC")), 
    (month2$year - month1$year)*12 + month2$mon - month1$mon + 1 
) 
#[1] 13 14 15 
+0

или 'с (..., потолок (difftime (месяц2, месяц1)/30))' – rawr

Смежные вопросы