我有7年的每日数据。我想将其分组为每周数据(基于实际日期)并汇总频率。
Date Frequency
1 2014-01-01 179
2 2014-01-02 82
3 2014-01-03 89
4 2014-01-04 109
5 2014-01-05 90
6 2014-01-06 66
7 2014-01-07 75
8 2014-01-08 106
9 2014-01-09 89
10 2014-01-10 82
实现此目标的最佳方法是什么?谢谢
这些解决方案全部使用基数R,仅在周的定义和标签上有所不同。
1] cut
将日期分成几周,然后将其汇总。星期从星期一开始,但是您可以根据需要在start.on.monday=FALSE
中添加cut
以在星期日开始。
Week <- as.Date(cut(DF$Date, "week"))
aggregate(Frequency ~ Week, DF, sum)
## Week Frequency
## 1 2013-12-30 549
## 2 2014-01-06 418
[2)如果您希望将一周定义为以DF $ Date [1]开头的7天,并根据该周中的第一个日期为它们加上标签,请使用此日期。 (如果您更喜欢一周中的最后一个日期,请在Week
中添加6。)>
,或者如果您更喜欢用该周中weekno <- as.numeric(DF$Date - DF$Date[1]) %/% 7 Week <- DF$Date[1] + 7 * weekno aggregate(Frequency ~ Week, DF, sum) ## Week Frequency ## 1 2014-01-01 690 ## 2 2014-01-08 277
[3)
DF
中存在的第一个日期标记,请使用此日期。如果没有丢失的日期,则此定义和最后一个Week定义将得到相同的结果,在这种情况下。 (如果要使用星期中的最后一个日期而不是第一个日期,则将match
替换为findInterval
。)weekno <- as.numeric(DF$Date - DF$Date[1]) %/% 7 Week <- DF$Date[match(weekno, weekno)] aggregate(Frequency ~ Week, DF, sum) ## Week Frequency ## 1 2014-01-01 690 ## 2 2014-01-08 277
注意
可复制形式的输入假定为:
Lines <- "Date Frequency
1 2014-01-01 179
2 2014-01-02 82
3 2014-01-03 89
4 2014-01-04 109
5 2014-01-05 90
6 2014-01-06 66
7 2014-01-07 75
8 2014-01-08 106
9 2014-01-09 89
10 2014-01-10 82"
DF <- read.table(text = Lines)
DF$Date <- as.Date(DF$Date)
除非有很好的理由,否则请务必使用ISO weeks以确保聚合间隔的大小相等。
我会使用library(lubridate)
。
也许您可以使用aggregate
+ format
,即,尝试基本R代码,>]
dfout <- aggregate(Frequency ~ yearweek,within(df,yearweek <- format(Date,"%Y,%W")),sum)
RStudio的新软件包slider
直接解决了这个问题,包括每周周期的开始。假设每周的时间段从星期一开始,因此第一周的开始时间为Monday, 2013-12-30
。然后,滑块解决方案将是