【问题标题】:R aggregate by week [duplicate]R按周聚合[重复]
【发布时间】:2018-04-10 15:01:25
【问题描述】:

R 新手,如果术语不正确,请见谅。

我有一个数据框

      date           val1   val2 val3         val4
1  2016-01-01     8007.59 128739 1573            0
2  2016-01-02     8526.98 142289 1798            0
3  2016-01-03     7720.77 132418 1433            0
4  2016-01-04     6845.67 123710 1280            0
5  2016-01-05     7176.20 126395 1302            0
6  2016-01-06     6125.98 117223 1148            2
7  2016-01-07     6125.16 109752 1119           30
8  2016-01-08     6869.92 107377 1233           24
9  2016-01-09     7289.16 107644 1326           25
10 2016-01-10     7360.92 124131 1330           21
11 2016-01-11     6697.14 112992 1185           26
12 2016-01-12     6418.59 106102 1116           22
13 2016-01-13     7334.01 118562 1156           21
14 2016-01-14     7845.45 113140 1184           17
15 2016-01-15     7902.26 104892 1207           37
16 2016-01-16     8443.98 114435 1336           37
17 2016-01-17     9010.53 129167 1370           29
18 2016-01-18     9750.08 125191 1467           29
19 2016-01-19     6864.10 101307 1085           11
20 2016-01-20     7519.02  89794 1095           21
21 2016-01-21     8208.62  82585 1039           15
22 2016-01-22     7839.53  78314 1000           26
23 2016-01-23     8104.59  79346 1089           32
24 2016-01-24     9133.29  80510 1135           33
25 2016-01-25     9763.78 103603 1217           21

我想总结每周的所有值。数据跨越多年,所以要明确的是,我不想汇总不同年份的周数(例如,不是所有的 week1s 所有 week2s ... week52s),而是只是总结每个单独的周年。

在 python/pandas 中,这将是 df.groupby(pd.Grouper(key='date', freq='w')).sum()

谢谢!

【问题讨论】:

  • dateweek <- format(x$date, "%Y-%V") 将给您"2018-15"(目前),其中 15 是 ISO 8601 定义的周数。您可以使用 %U 代替,稍有不同的约定。有了这个,你可以使用任何你喜欢的工具进行分组(dplyr::group_by,data.table,aggregate/by,...)。
  • 需要注意一些。请参阅more-falsehoods-programmers-believe-about-time 中的第 24 号
  • @dww,这是对我的"%V" 建议还是一般处理日期/时间的谨慎?
  • @r2evans 一般。如果 ISO 8601 是您想要的定义,那么您的建议就是正确的。只是说不同地方的不同人对一周有不同的定义,我们不应该太快假设 ISO 或任何其他定义总是正确的。例如,从星期日开始的几周是很常见的地方。

标签: r datetime group-by aggregate


【解决方案1】:

要按 ISO 对周的定义进行分组,请使用

require(tidyverse)
df %>% 
  group_by(year = year(date), week = week(date)) %>% 
  summarise_if(is.numeric, sum)

要从周日开始按周分组,请使用 @r2evans 建议

require(tidyverse)
df %>% 
  group_by(week = format(date, '%Y-%U'))%>% 
  summarise_if(is.numeric, sum)

【讨论】:

  • summarie_at(.vars = 2:5, sum)
  • 这似乎只是按 7 天的块分组,这没问题,但有什么方法可以按日历周分组?
  • 按 ISO 标准周定义分组,周从星期一开始。我添加了一个选项,从星期日开始几周。
猜你喜欢
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
相关资源
最近更新 更多