r-时间序列数据集中不同月份的"summary"和"group_by"的不同结果



我有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函数将同一年的二月日期四舍五入到一月日期。我预计在将二月作为Date列中的第一个元素剪切数据后,floor_date将从二月开始。显然没有。我也尝试过其他三个月的系列赛,发现它们的结果与FMA系列赛相同。我还试图更改数据帧的索引,使其与子集/剪切之前的原始索引相同,但没有成功。

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

谢谢。

这里,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

相关内容

  • 没有找到相关文章

最新更新