计算连续的月份序列

时间:2020-02-14 21:54:00

标签: r

如果我的年和月向量是这样编码的:

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为中心的解决方案都将受到欢迎。

2 个答案:

答案 0 :(得分:1)

我们可以使用

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

答案 1 :(得分:1)

也许您可以使用rle

尝试以下基本R代码
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