时间序列数据集中不同月份的 `summarize` 和 `group_by` 的不同结果
Different results of `summarize` and `group_by` with different months in time-series datasets
我有 20 多年的每日时间序列数据。我想提取每年三个月 window 的分位数 (0.1, 0.5, 0.9),分为 JFM (Jan-Mar), FMA (Feb-Apr), ... 等等,直到 OND (十月至十二月)。作为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 集相同。我还尝试更改数据帧的索引,使其与 subset/cut 之前的原始索引相同,但没有成功。
如何解决这个问题?
其他从一年中的给定时间段获取分位数的方法(在 post 开头描述的我的目标意义上)也非常受欢迎。
谢谢。
此处,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
我有 20 多年的每日时间序列数据。我想提取每年三个月 window 的分位数 (0.1, 0.5, 0.9),分为 JFM (Jan-Mar), FMA (Feb-Apr), ... 等等,直到 OND (十月至十二月)。作为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 集相同。我还尝试更改数据帧的索引,使其与 subset/cut 之前的原始索引相同,但没有成功。
如何解决这个问题? 其他从一年中的给定时间段获取分位数的方法(在 post 开头描述的我的目标意义上)也非常受欢迎。
谢谢。
此处,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