Mon début sur un exemple :

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

Quel est le problème avec le code ci-dessus ? Il ne généralisera pas au-delà des situations où yr_min se termine par un 1 et yr_max se termine par un 5.

Par exemple:

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

La sortie souhaitée est

[1] 20183 20185 20191 20193
r
0
Clarinetist 19 nov. 2018 à 16:48

3 réponses

Meilleure réponse

1) Générez toute la séquence d'années puis Filter() sur tout ce qui n'est pas 1,3,5 modulo 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
  • Il s'agit de la programmation fonctionnelle en R avec les constructions Filter (), Map (), Réduire () ...)
  • comme le disent les autres, pour ces restes spécifiques 1,3,5, vous pouvez exploiter que vous n'avez besoin que de l'étape 2: seq(yr_min, yr_max, by=2)

Ou 2) générer la séquence des décades de base 20180, 20190 ... et ajouter vous-même les décalages 1,3,5. Même différence.

2
smci 19 nov. 2018 à 22:20

Données prédéfinies:

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

Code:

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)]

Résultat:

# [1] 20183 20185 20191 20193
0
Andre Elrico 19 nov. 2018 à 14:40

Je recommanderais d'utiliser des dates de bonne foi dans votre calcul. Cela nous permet de profiter de la fonction seq de la base 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"

Si vous voulez vraiment le format exact que vous avez, vous pouvez facilement le faire avec un autre appel à format:

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

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

Ou, pour votre sortie exacte :

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

[1] "20183" "20185" "20191" "20193"
3
Tim Biegeleisen 19 nov. 2018 à 14:02