Как рассчитать месячный интервал в наборе данных?

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

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

Спасибо.


person cyrusjan    schedule 26.05.2016    source источник
comment
что ты пробовал? помогает ли это stackoverflow.com/questions/13287798/ к вашему сведению, вы можете создать data просто с помощью data.frame(month1 = c("Jul-96","Aug-96","Sep-96"), month2 = c("Jul-97","Sep-97","Nov-97"))   -  person rawr    schedule 26.05.2016
comment
Я пробовал это, но кажется, что я не мог вычислить это в наборе данных. Спасибо   -  person cyrusjan    schedule 26.05.2016


Ответы (2)


Мы могли бы сделать это, преобразовав yearmon class из 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
person akrun    schedule 26.05.2016
comment
Спасибо. Это помогает - person cyrusjan; 26.05.2016

Это не слишком красиво, но, преобразовав объект даты и времени 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
person thelatemail    schedule 26.05.2016