Учитывая два года + 1/3/5 целых чисел, сгенерируйте вектор всех чисел года + 1/3/5 между ними (включительно) - PullRequest
0 голосов
/ 19 ноября 2018

Мой старт на примере :

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 оканчивается на 1, а yr_max оканчивается на 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

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

1) Генерация всей последовательности лет, затем Filter() из всего, что не 1,3,5 по модулю 10.

rem_135_mod10 <- function(x) { (x %% 10) %in% c(1,3,5) }

Filter(rem_135_mod10, seq(yr_min, yr_max))
# 20181 20183 20185 20191 20193 20195
  • Это функциональное программирование в R с помощью конструкций Filter (), Map (), Reduce () ... )
  • , как говорят другие, для этих конкретных остатков 1,3,5 вы можете использовать только шаг2: seq(yr_min, yr_max, by=2)

или 2) сгенерируйте последовательность базовых десятилетий 20180, 20190 ... и добавьте смещения 1,3,5 самостоятельно.Та же разница.

0 голосов
/ 19 ноября 2018

предопределенные данные:

end_vec <- c(1, 3, 5)
yr_min  <- 20183
yr_max  <- 20193

код:

ans<-
c(
sapply(c(yr_min, yr_max), function(x) {n<-nchar(x);as.numeric(paste0(substr(x,1,n-1),end_vec))})
)

ans[dplyr::between(ans, yr_min, yr_max)]

результат:

# [1] 20183 20185 20191 20193
0 голосов
/ 19 ноября 2018

Я бы порекомендовал использовать в ваших расчетах добросовестные даты.Это позволяет нам воспользоваться преимуществом функции seq базового R:

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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...