给定不同的开始和结束日期,找到每个变量的每日平均值

问题描述

我的数据具有不同的开始和结束日期。

mydata <- data.frame(id=c(1,2,3),start=c("2010/01/01","2010/01/01","2010/01/02"),end=c("2010/01/01","2010/01/05","2010/01/03"),a=c(140,750,56),b=c(48,25,36))
mydata

  id      start        end   a  b
1  1 2010-01-01 2010-01-01 140 48
2  2 2010-01-01 2010-01-05 750 25
3  3 2010-01-02 2010-01-03  56 36

我想查找每天变量@H_502_7@ a 和@H_502_7@ b 的平均值。在下面,我通过展开每行中具有不同开始和结束日期的行来执行它,然后将其折叠回每天的水平。

mydata$subt <- as.numeric(as.Date(mydata$end,"%Y/%m/%d") - as.Date(mydata$start,"%Y/%m/%d") + 1)

require(data.table) 
mydata <- setDT(mydata)[,list(idnum = id,date = seq(start,end,by = "day"),a=a/subt,b=b/subt),by = 1:nrow(mydata)]
mydata

   nrow idnum       date   a  b
1:    1     1 2010-01-01 140 48
2:    2     2 2010-01-01 150  5
3:    2     2 2010-01-02 150  5
4:    2     2 2010-01-03 150  5
5:    2     2 2010-01-04 150  5
6:    2     2 2010-01-05 150  5
7:    3     3 2010-01-02  28 18
8:    3     3 2010-01-03  28 18

mydata %>%
  group_by(date) %>%
  summarize(a = sum(a),b = sum(b))

所需结果:

  date           a     b
  <date>     <dbl> <dbl>
1 2010-01-01   290    53
2 2010-01-02   178    23
3 2010-01-03   178    23
4 2010-01-04   150     5
5 2010-01-05   150     5

但是,我有很多行具有不同的开始和结束日期,有时差异的长度非常长。我想知道是否有更简单的方法(即不展开每一行)来查找每个变量的每日平均值。如果有一种方法可以找到每周平均值而不先找到每日数字,那也很好。谢谢!

解决方法

这里是tidyverse的一个选项。我们使用Date(从ymd)将“开始”“结束”列转换为lubridate类,从“开始”到“结束”创建seq个日期对于具有map2mutate'a','b'的相应元素,将它们除以lengths列'date',list的{​​{1}} “日期”并按“日期”分组,我们得到“ a”,“ b”的unnest

sum