首页 > 解决方案 > R:两个日期之间的移动平均时间长度

问题描述

我有一个包含开始日期和结束日期的观察数据集。我想计算开始日期和结束日期之间的移动平均差异。

我在下面包含了一个示例数据集。

require(dplyr)
df <- data.frame(id=c(1,2,3), 
                 start=c("2019-01-01","2019-01-10", "2019-01-05"),
                 end=c("2019-02-01", "2019-01-15", "2019-01-10"))
df[,c("start", "end")] <- lapply(df[,c("start", "end")], as.Date)
id   start         end
1    2019-01-01    2019-02-01
2    2019-01-10    2019-01-15
3    2019-01-05    2019-01-10

总体日期范围为2019-01-012019-02-01。我想计算该范围内每个日期的开始日期和结束日期之间的平均差异。

结果看起来就像这样。我已经包含了应该显示的平均值的实际值:

date          avg
2019-01-01    0
2019-01-02    1
2019-01-03    2
2019-01-04    3
2019-01-05    4
2019-01-06    3
2019-01-07    4
2019-01-08    5
2019-01-09    6
2019-01-10    7
2019-01-11    5.5
    .         .
    .         .
    .         .

标签: r

解决方案


根据评论编辑答案。

创建df:

require(dplyr)
df <- data.frame(id=c(1,2,3), 
                 start=c("2019-01-01", "2019-01-10", "2019-01-05"),
                 end=c("2019-02-01", "2019-01-15", "2019-01-10"))
df[,c("start", "end")] <- lapply(df[,c("start", "end")], as.Date)

为每个开始-结束组合创建日期:

#gives the list of all dates within start and end frames and calculates difference
datesList = lapply(1:nrow(df),function(i){
  dat = data_frame('date'=seq.Date(from=df$start[i],to=df$end[i],by=1),
                   'start'=df$start[i]) %>% 
    dplyr::mutate(diff=date-start)
})

最后, group_by 日期并找到 avg 以提供与问题中的输出完全相同的输出:

finalDf = bind_rows(datesList) %>% 
  dplyr::filter(diff != 0) %>% 
  dplyr::group_by(date) %>% 
  dplyr::summarise(avg=mean(diff,na.rm=T))

因此输出变为:

# A tibble: 31 x 2
   date       avg     
   <date>     <time>  
 1 2019-01-02 1.0 days
 2 2019-01-03 2.0 days
 3 2019-01-04 3.0 days
 4 2019-01-05 4.0 days
 5 2019-01-06 3.0 days
 6 2019-01-07 4.0 days
 7 2019-01-08 5.0 days
 8 2019-01-09 6.0 days
 9 2019-01-10 7.0 days
10 2019-01-11 5.5 days
# … with 21 more rows

让我知道它是否有效。


推荐阅读