Problème:

J'ai un ensemble de données pluriannuel dans lequel je souhaite supprimer une plage de dates (par exemple, du 1er mai au 31 août) pour toutes les années. Je souhaite conserver les dates du 30 avril au 1er septembre pour toutes les années.

Exemple de données:

dat <- data.frame(
  "Date" = c("2000-08-01","2000-11-02","2001-08-03","2001-11-04","2002-06-05","2002-02-06","2000-08-07","2000-02-08","2001-06-09","2001-11-10"),
  "Type" = c("A", "B", "C", "B", "C", "B", "A", "A", "C", "B"),
  "Num" = c(8,6,5,6.5,5,5.5,6,7,4,3)
)
dat

Ce que j'ai essayé:

J'ai créé un objet avec les dates du 1er mai sur toutes les années et en utilisant une boucle for pour supprimer le nombre de jours qui suivront jusqu'au 31 août. Je sais que c'est une manière extrêmement détournée, donc je me demande s'il existe une solution plus simple car il s'agit d'un ensemble de données assez volumineux.

dates_start <- as.Date(c("2000-05-01", "2001-05-01", "2002-05-01"))

for(i in 1:length(dates_start)){
  dat <- dat[!(as.Date(dat$Date) >= (dates_start[i] + 123)),]
}

Modifier:

Je prévois d'exécuter ce filtre / suppression plusieurs fois pour obtenir différents ensembles de données, et dans certains cas, je souhaite supprimer les dates au milieu du mois (par exemple, du 15 avril au 16 août), donc supprimer simplement certains mois ne fonctionnerait pas ici.

2
jl748795 21 oct. 2020 à 15:02

3 réponses

Meilleure réponse

Vous pouvez créer une date dynamiquement pour supprimer:

library(dplyr)
library(lubridate)

start <- '04-15'
end <- '08-16'

dat %>% 
  mutate(Date = as.Date(Date), 
         year = year(Date)) %>%
  filter(!(Date >= ymd(paste(year, start, sep = '-')) & 
          Date <= ymd(paste(year, end, sep = '-'))))


#       Date Type Num year
#1 2000-11-02    B 6.0 2000
#2 2001-11-04    B 6.5 2001
#3 2002-02-06    B 5.5 2002
#4 2000-02-08    A 7.0 2000
#5 2001-11-10    B 3.0 2001
1
Ronak Shah 21 oct. 2020 à 13:11

Est-ce que ça marche:

> library(dplyr)
> library(lubridate)
> dat$Date <- ymd(dat$Date)
> dat %>% filter(!month(Date) %in% 5:8)
        Date Type Num
1 2000-11-02    B 6.0
2 2001-11-04    B 6.5
3 2002-02-06    B 5.5
4 2000-02-08    A 7.0
5 2001-11-10    B 3.0
> 
1
Karthik S 21 oct. 2020 à 12:10

Comme votre date est un character, vous pouvez extraire le mois avec sub, puis un sous-ensemble en utilisant ce numéro de mois.

x <- as.integer(sub("\\d+-(\\d+)-\\d+", "\\1", dat$Date))
#x <- as.integer(format(as.Date(dat$Date), "%m")) #Alternative using Date
dat[x<5L | x>8L,]
#         Date Type Num
#2  2000-11-02    B 6.0
#4  2001-11-04    B 6.5
#6  2002-02-06    B 5.5
#8  2000-02-08    A 7.0
#10 2001-11-10    B 3.0

Et pour les plages également avec des jours - où les jours inférieurs à 10 doivent être précédés d'un 0 :

x <- as.integer(sub("\\d+-(\\d+)-(\\d+)", "\\1\\2", dat$Date))
dat[x<501L | x>831L,]

Ou collez l'année dans le mois:

x <- format(as.Date(dat$Date), "%Y")
dat[as.Date(dat$Date) < as.Date(paste0(x,"-05-01")) |
    as.Date(dat$Date) > as.Date(paste0(x,"-08-31")),]

Ou:

x <- as.Date(paste0("2000-", format(as.Date(dat$Date), "%m-%d")))
dat[x<as.Date("2000-05-01") | x>as.Date("2000-08-31"),]
1
GKi 22 oct. 2020 à 06:52