【问题标题】:Filter data by last 12 Months of the total data available in R按 R 中可用总数据的过去 12 个月过滤数据
【发布时间】:2020-10-09 09:09:06
【问题描述】:

R:

我有一个数据集,其中 N 个产品的销售值从某个 yyyy-mm-dd 到某个 yyyy-mm-dd,我只想过滤数据集中每个产品的过去 12 个月的数据。

例如: 说,我有从 2016-01-01 到 2020-02-01 的值 所以现在我想过滤从 2019-02-01 到 2020-02-01 的过去 12 个月的销售值 我不能简单地提及“过滤器(月 >= as.Date("2019-04-01") & Month

【问题讨论】:

    标签: r date


    【解决方案1】:

    你可以使用:

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

    【讨论】:

    • 谢谢罗纳克。对于那些希望这样做几个月的人,您可能会遇到 NA 问题。 1 月 31 日 + 1 个月 = 2 月 28 日还是 3 月 3 日?看看这个link 并使用lubridate 的%m-% 来提供帮助。例如filter(between(date, max(date) $m-$ months(1), max(date)))
    【解决方案2】:

    您可以测试日期是否大于等于每个产品的最大日期减去 365 天:

    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
    

    数据

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

    【讨论】:

      【解决方案3】:

      如果您的目标是仅捕获从今天到去年同一天的条目,那么:

      函数Sys.Date() 将当前日期作为Date 类型的对象返回。然后,您可以将其转换为 POSIXlc 表格以调整年份以获取开始日期。例如:

      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)
      

      现在这确实有一个潜在的失败状态:如果今天是 2 月 29 日。解决这个问题的一种方法是编写一个“today.last.year”函数来进行上述转换,但对闰年给出明确的处理——可能包括将“去年的今天”计为 2 月 28 日或3 月 1 日,具体取决于您想要的行为。

      或者,如果您想根据月初日期进行过滤,您可以让您的函数也设置start.date.lt$day = 1,如果您需要以不同方式进行调整,依此类推。

      【讨论】:

        【解决方案4】:

        输入:

           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
        

        代码:

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

        输出:

           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
        

        这是你要找的吗?

        【讨论】:

          猜你喜欢
          • 2022-09-27
          • 1970-01-01
          • 1970-01-01
          • 2019-07-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-11
          • 1970-01-01
          相关资源
          最近更新 更多