首页 > 解决方案 > 给定两个 Year + 1/3/5 整数,生成它们之间的所有 Year + 1/3/5 整数的向量(包括)

问题描述

我从一个例子开始

yr_min <- 20181
yr_max <- 20195

as.numeric(paste0(rep(
  seq(as.numeric(substr(yr_min, 1, 4)), 
      as.numeric(substr(yr_max, 1, 4))), 
  each = 3),
  c(1, 3, 5)))

[1] 20181 20183 20185 20191 20193 20195

上面的代码有什么问题?它不会概括超出yr_min以 a​​ 结尾1yr_max以 a 结尾的情况5

例如:

yr_min <- 20183
yr_max <- 20193

as.numeric(paste0(rep(
  seq(as.numeric(substr(yr_min, 1, 4)), 
      as.numeric(substr(yr_max, 1, 4))), 
  each = 3),
  c(1, 3, 5)))

[1] 20181 20183 20185 20191 20193 20195

所需的输出是

[1] 20183 20185 20191 20193

标签: r

解决方案


我建议在您的计算中使用真正的日期。这使我们能够利用 base R 的seq功能:

x <- seq(as.Date("2018/3/1"), as.Date("2019/3/1"), by="month")
x[format(x, "%m") %in% c("01", "03", "05")]

[1] "2018-03-01" "2018-05-01" "2019-01-01" "2019-03-01"

如果您真的想要您拥有的确切格式,您可以通过另一个调用轻松地做到这一点format

y <- x[format(x, "%m") %in% c("01", "03", "05")]
format(y, "%Y%m")

[1] "201803" "201805" "201901" "201903"

或者,对于您的确切输出:

sub("(?<=\\d{4}).", "", format(y, "%Y%m"), perl=TRUE)

[1] "20183" "20185" "20191" "20193"

推荐阅读