如果我的年和月向量是这样编码的:
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为中心的解决方案都将受到欢迎。
答案 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 <- 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