【问题标题】:Different results of `summarize` and `group_by` with different months in time-series datasets时间序列数据集中不同月份的“summarize”和“group_by”的不同结果
【发布时间】:2021-09-01 02:37:27
【问题描述】:

我拥有超过 20 年的每日时间序列数据。我想通过每年三个月的窗口提取分位数(0.1、0.5、0.9),分为 JFM(1 月至 3 月)、FMA(2 月至 4 月)……等等,直到 OND(10 月至 12 月) )。作为一个R新手,经过近两周这么多天的研究,终于找到了做到这一点的方法。但是,在最后一步,我被困在了这个问题上。

实际上,我正在使用列表。但是,例如,假设我们有这个数据框:

library(lubridate)
Date<-seq.Date(ymd(19700101),ymd(19721231),"day")
Q<-runif(ymd(19730101)-ymd(19700101),1,20)
df<-data.frame(Date,Q)

现在,我们将 df 子集化以仅获得特定的三个月(在本例中为 JFM 和 FMA):

df.JFM<-df[months(df$Date) %in% month.name[1:3],] #cutting Jan-Mar
df.FMA<-df[months(df$Date) %in% month.name[2:4],] #cutting Feb-Apr

然后,为了找到三个月系列的 50% 的分位数,我使用以下方法:

library(dplyr)
df.JFM %>% group_by(Year=floor_date(Date, "3 months")) %>%
  summarize(Q=quantile(Q, 0.5, na.rm=T))
# A tibble: 3 x 2
  Year           Q
  <date>     <dbl>
1 1970-01-01  8.83
2 1971-01-01  9.88
3 1972-01-01 11.3 

JFM 集中没有问题。让我们看看 FMA 集:

df.FMA %>% group_by(Year=floor_date(Date, "3 months")) %>%
  summarize(Q=quantile(Q, 0.5, na.rm=T))
# A tibble: 6 x 2
  Year           Q
  <date>     <dbl>
1 1970-01-01  8.75
2 1970-04-01 13.5 
3 1971-01-01  8.58
4 1971-04-01 13.2 
5 1972-01-01 10.2 
6 1972-04-01  8.29

在这里,我们发现floor_date 函数将二月日期向下舍入为同一年的一月日期。我预计在我将数据以二月作为日期列中的第一个元素进行剪切后,floor_date 将从二月开始。显然没有。我也尝试过其他三个月的系列,发现它们给出的结果与 FMA 集相同。我还尝试将数据帧的索引更改为与子集/剪切之前的原始索引相同,但没有运气。

如何解决这个问题? 从一年中的给定时期获取分位数的其他方法(就我在帖子开头描述的目标而言)也非常受欢迎。

谢谢。

【问题讨论】:

    标签: r date dplyr time-series lubridate


    【解决方案1】:

    在这里,floor_date/ceiling_date 始终从年初开始每 3 个月执行一次舍入,而不是基于数据中的日期。

    在这里,您可以使用 cut 来代替,它可以根据您的要求工作。

    library(dplyr)
    
    df.JFM %>% 
      group_by(Year=cut(Date, "3 months")) %>%
      summarize(Q=quantile(Q, 0.5, na.rm=TRUE))
    
    #  Year           Q
    #  <fct>      <dbl>
    #1 1970-01-01 11.0 
    #2 1971-01-01 11.5 
    #3 1972-01-01  9.57
    
    df.FMA %>% 
      group_by(Year= cut(Date, '3 months')) %>%
      summarize(Q = quantile(Q, 0.5, na.rm=T))
    
    #   Year        Q
    #  <fct>      <dbl>
    #1 1970-02-01 11.3 
    #2 1971-02-01 10.5 
    #3 1972-02-01  9.67
    

    【讨论】:

      猜你喜欢
      • 2020-03-19
      • 2020-04-10
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 2020-09-09
      • 2021-07-07
      • 2018-03-21
      • 2016-11-13
      相关资源
      最近更新 更多