1
votes

Filtrer les données par 12 derniers mois du total des données disponibles dans R

R:

J'ai un ensemble de données avec une valeur de vente de N produits allant d'un certain aaaa-mm-jj à un certain aaaa-mm-jj, je veux simplement filtrer les données des 12 derniers mois pour chaque produit de l'ensemble de données.

Par exemple: Dites, j'ai des valeurs du 01/01/2016 au 01/02/2020 Alors maintenant, je veux filtrer les valeurs des ventes des 12 derniers mois, du 01/02/2019 au 01/02/2020 Je ne peux pas simplement mentionner un "filter (Month> = as.Date (" 2019-04-01 ") & Month <= as.Date (" 2020-04-01 "))" car la date de fin ne cesse de changer pour mon cas comme chaque mois passe, je dois donc automatiser le cas.


0 commentaires

4 Réponses :


1
votes

Vous pouvez utiliser:

library(dplyr)
library(lubridate)
data %>%
  group_by(Product) %>%
  filter(between(date, max(date) - years(1), max(date)))
  #filter(date >= (max(date) - years(1)) & date <= max(date))


0 commentaires

0
votes

Vous pouvez tester si la date est supérieure à la date maximale par produit moins 365 jours:

df <- data.frame(
  Products = c(1,1,1,1,2,2,2,3,3,3), 
  Date = as.Date(c("2000-02-01", "2002-01-21", "2002-02-10", 
                   "2000-06-01", "2002-02-24", "2002-02-10",
                   "2001-07-01", "2003-01-02", "2005-03-10",
                   "2002-05-01")))

Données

library(dplyr)
df %>% 
  group_by(Products) %>% 
  filter(Date >= max(Date)-365)

# A tibble: 6 x 2
# Groups:   Products [3]
  Products Date      
     <dbl> <date>    
1        1 2002-01-21
2        1 2002-02-10
3        2 2002-02-24
4        2 2002-02-10
5        2 2001-07-01
6        3 2005-03-10


0 commentaires

0
votes

Si votre objectif est simplement de capturer les entrées d'aujourd'hui au même jour l'année dernière, alors:

La fonction Sys.Date () renvoie la date actuelle sous la forme d'un objet de type Date . Vous pouvez ensuite le convertir en formulaire POSIXlc pour ajuster l'année et obtenir la date de début. Par exemple:

end.date <- Sys.Date()
end.date.lt <- asPOSIXlt(end.date)
start.date.lt <- end.date.lt
start.date.lt$year <- start.date.lt$year - 1
start.date <- asPOSIXct(start.date.lt)

Maintenant, cela a un état d'échec potentiel: si aujourd'hui est le 29 février. Une façon de résoudre ce problème serait d'écrire une fonction "today.last.year" pour effectuer la conversion ci-dessus, mais de donner un traitement explicite pour les années bissextiles - éventuellement en incluant une option pour compter "aujourd'hui l'année dernière" comme 28 février ou 1er mars, selon ce qui vous donne le comportement souhaité.

Alternativement, si vous vouliez filtrer en fonction d'une date de début de mois, vous pouvez faire en sorte que votre fonction règle également start.date. lt $ day = 1 , et ainsi de suite si vous avez besoin d'ajuster de différentes manières.


0 commentaires

0
votes

Input:

   product       date
1:       a 2018-07-01
2:       b 2018-10-01
3:       a 2019-01-01
4:       b 2019-04-01
5:       a 2019-07-01
6:       b 2019-10-01

Code:

library(lubridate)
library(data.table)

DT <- data.table(
  product = rep(c("a", "b"), 6),
  date = seq(as.Date("2017-01-01"), as.Date("2019-12-31"), by = "quarter")
)

yearBefore <- function(x){
  year(x) <- year(x) - 1
  x
}

date_DT <- DT[, .(last_date = last(date)), by = product]
date_DT[, year_before := yearBefore(last_date)]
result <- DT[, date_DT[DT, on = .(product, year_before <= date), nomatch=0]]
result[, last_date := NULL]
setnames(result, "year_before", "date")

Output:

   product       date
 1:       a 2017-01-01
 2:       b 2017-04-01
 3:       a 2017-07-01
 4:       b 2017-10-01
 5:       a 2018-01-01
 6:       b 2018-04-01
 7:       a 2018-07-01
 8:       b 2018-10-01
 9:       a 2019-01-01
10:       b 2019-04-01
11:       a 2019-07-01
12:       b 2019-10-01

Est-ce ce que vous recherchez?


0 commentaires