【问题标题】:New category based on sequence of date ranges基于日期范围序列的新类别
【发布时间】:2019-08-16 00:12:47
【问题描述】:

我有一个 data.frame,我想在其中创建一个新列,对样本的来源时间段进行分类。每个时期从 8 月 1 日开始,到 7 月 31 日结束。例如,期间 1 为 2001 年 8 月 1 日至 2002 年 7 月 31 日,期间 2 为 2002 年 8 月 1 日至 2003 年 7 月 31 日

我一直在尝试使用 dplyr,因为我想要一个整洁的解决方案。

以下是data.frame的示例

Date <- seq(as.Date("2001/08/01"), by = "month", length.out = 60)
AHD <- rnorm(60, mean = 12, sd = 1)
df <- data.frame(Date=Date, AHD = AHD)

我可以使用以下方法将 data.frame 子集到其中一个周期中:

df %>%
  group_by(dr = cut(Date, breaks = c(range(Date), 
                                     as.Date(c("2001-08-01", "2002-07-31"))), include.lowest=TRUE) )

但是,我不知道如何在一系列期间执行此操作,也不知道如何构建新的类别列。我需要一个新列来说明每一行是否属于周期 1、周期 2 等。

【问题讨论】:

    标签: r date dplyr


    【解决方案1】:

    我们可以创建从minDatemax 的年度日期序列,并在cut 中使用它

    period <- seq(min(df$Date), max(df$Date), by = "1 year")
    df$period <- cut(df$Date, breaks =  c(period, Inf), 
                  labels = paste0("period", seq_along(period)))
    
    
    df
    #         Date          AHD  period
    #1  2001-08-01 10.792934251 period1
    #2  2001-09-01 12.277429242 period1
    #3  2001-10-01 13.084441177 period1
    #4  2001-11-01  9.654302297 period1
    #5  2001-12-01 12.429124689 period1
    #6  2002-01-01 12.506055892 period1
    #7  2002-02-01 11.425260040 period1
    #8  2002-03-01 11.453368144 period1
    #9  2002-04-01 11.435548001 period1
    #10 2002-05-01 11.109962171 period1
    #11 2002-06-01 11.522807300 period1
    #12 2002-07-01 11.001613555 period1
    #13 2002-08-01 11.223746105 period2
    #....
    

    我们也可以使用findInterval,其结果与cut相同

    df$period <- paste0("period", findInterval(df$Date,  period))
    

    数据

    set.seed(1234)
    Date <- seq(as.Date("2001/08/01"), by = "month", length.out = 60)
    AHD <- rnorm(60, mean = 12, sd = 1)
    df <- data.frame(Date=Date, AHD = AHD)
    

    【讨论】:

    • 是的,效果很好!谢谢。但是,有没有一种方法可以让它在不指定日期范围的情况下工作。 data.frame 的第一行是给定年份的 8 月 1 日,您需要在次年的 7 月 31 日之前进行分组。
    • @ChristopherKavazos 不需要分组,我们可以指定 minmax Date 作为间隔,应该适用于所有日期范围。我已经更新了答案。
    【解决方案2】:

    这是基于类似问题here的答案的解决方案

    library(tidyverse)
    library(zoo)
    
    
    Date <- seq(as.Date("2001/08/01"), by = "month", length.out = 60)
    AHD <- rnorm(60, mean = 12, sd = 1)
    df <- data.frame(Date=Date, AHD = AHD)
    
    df=df%>% mutate(period=as.integer(as.yearmon(Date) - 7/12 + 1)-2001)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      相关资源
      最近更新 更多