Подсчет непрерывных последовательностей месяцев - PullRequest
2 голосов
/ 15 февраля 2020

Если у меня есть вектор года и месяца, закодированный так:

ym <- c(
  201401,
  201403:201412,
  201501:201502,
  201505:201510,
  201403
)

И я бы хотел получить вектор, который выглядит следующим образом:

 [1]  1  1  2  3  4  5  6  7  8  9 10  11  12  1  2  3  4  5  6  1

То есть я хочу считать непрерывные последовательности месячных записей. Кто-нибудь может порекомендовать подход? Я крутил свои колеса примерно так:

ym_date <- as.Date(paste0(ym, 01), format = "%Y%m%d")

diff(ym_date)

, но не смог продвинуться дальше, потому что я не уверен, как пометить этот старт последовательности, когда мы имеем дело с месяцами , Любая база R, Tidyverse, data.frame centri c или не решение будет приветствоваться.

Ответы [ 2 ]

1 голос
/ 15 февраля 2020

Может быть, вы можете попробовать следующий базовый код R с rle

r <- unlist(sapply(rle(cumsum(c(1,round(as.numeric(diff(ym_date))/30.24)!=1)))$lengths,seq_along))

или с ave

r <- ave(ym,cumsum(c(1,round(as.numeric(diff(ym_date))/30.24)!=1)),FUN = seq_along)

таким, что

> r
 [1]  1  1  2  3  4  5  6  7  8  9 10  11  12  1  2  3  4  5  6  1
1 голос
/ 15 февраля 2020

Мы можем использовать

library(lubridate)
mth <- month(ym_date)
new <- mth + cumsum(c(0, (mth %/% 12)[-length(mth)])) * 12
ave(mth, cumsum(c(TRUE, diff(new) != 1)), FUN = seq_along)
#[1]  1  1  2  3  4  5  6  7  8  9 10 11 12  1  2  3  4  5  6  1

Это также можно записать более компактным способом

ave(mth, cumsum(c(TRUE, diff(c(0, head(cumsum(mth == 12), -1)) * 12 + mth) != 1)), FUN = seq_along)
#[1]  1  1  2  3  4  5  6  7  8  9 10 11 12  1  2  3  4  5  6  1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...