在 R 中将每日数据转换为每周数据

aua*_*aua 1 r date frequency

我有 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
Run Code Online (Sandbox Code Playgroud)

实现这一目标的最佳方法是什么?谢谢

J_F*_*J_F 7

我会用library(lubridate).

df <- read.table(header = TRUE,text = "date Frequency
2014-01-01  179
2014-01-02  82  
2014-01-03  89  
2014-01-04  109 
2014-01-05  90  
2014-01-06  66  
2014-01-07  75  
2014-01-08  106 
2014-01-09  89  
2014-01-10  82")
Run Code Online (Sandbox Code Playgroud)

您可以使用基本 R 或library(dplyr)

base R:确保日期确实是日期:

df$date <- ymd(df$date)
df$week <- week(df$date)
Run Code Online (Sandbox Code Playgroud)

或简称:

df$week <- week(ymd(df$date))
Run Code Online (Sandbox Code Playgroud)

或 dplyr:

library(dplyr)
df %>% 
  mutate(week = week(ymd(date))) %>% 
  group_by(week)
Run Code Online (Sandbox Code Playgroud)

出去:

在此输入图像描述


G. *_*eck 7

这些解决方案都使用基础 R,仅在周的定义和标签上有所不同。

1) cut将日期转换为周,然后汇总这些日期。周从周一开始,但如果您愿意,可以添加start.on.monday=FALSEcut周日开始。

Week <- as.Date(cut(DF$Date, "week"))
aggregate(Frequency ~ Week, DF, sum)
##         Week Frequency
## 1 2013-12-30       549
## 2 2014-01-06       418
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

3)或者,如果您希望将其标记DF为该周中存在的第一个日期,则使用它。如果没有缺失日期,则此定义和上周定义给出相同的结果,就像这里的情况。(如果您想要一周中的最后一个现有日期而不是第一个,请替换matchfindInterval。)

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
Run Code Online (Sandbox Code Playgroud)

笔记

可重现形式的输入假定为:

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)
Run Code Online (Sandbox Code Playgroud)