首页 > 解决方案 > 根据不同的日期列计算两个日期之间的变量平均值

问题描述

我有一个类似于下面的 xdata tibble 的数据集。当开始日期的月份与日期的月份不同时,我想在开始日期定义的日期和五天后的开始日期之间计算值变量的平均值。

[为清晰而编辑]

library(lubridate)
library(tibble)

xdata <- tibble(date=ymd('2015-01-01')+days(seq(1:(365*3))), values=seq(1,365*3))

xdata <- xdata %>% mutate(start_date = case_when(wday(date)==2 ~ date+days(14))) %>% 
         fill(start_date)

xdata %>% mutate(avg = case_when(month(start_date) != month(date) ~ mean(values[between(date, start_date, start_date+days(5))])))

我也试过

xdata %>% group_by(start_date) %>% mutate( . . . 

但这并不能解决问题。

我期待的是以下内容:第一个非 NA start_date 出现在第 4 行,并且是 start_date='2015-01-19'

我想计算 date='2015-01-19' 和接下来 4 天的值(数据列)的平均值。这些值为 18、19、20、21 和 22。平均值应为 20。

平均由 start_date 确定的日期中的 5 个值

计算基于 start_date 的范围定义的日期之间的平均值的最佳方法是什么?

谢谢,

jfd118

答案 - Jon Spring 让我找到了解决方案:

xdata %>%
  filter(!is.na(start_date)) %>%
  mutate(avg = slide_index_dbl(values, date, mean, .before=1, .after = 5)) %>%
  select(start_date = date, avg) %>% 
  right_join(xdata ) %>% 
  select(date, values, everything()) %>%
  arrange(date) %>% View()

标签: rdplyr

解决方案


这是一种使用 的方法slider,它非常适合像这样的窗口计算。我不知道如何跳过 NA start_date 行的滑块计算,所以这会将它们过滤掉,然后通过连接将它们带回:

library(slider); library(lubridate); library(dplyr)
xdata %>%
  filter(!is.na(start_date), month(start_date) != month(date)) %>%
  mutate(avg = slide_index_dbl(values, start_date, .after = 4, mean)) %>%
  right_join(xdata) %>% arrange(date) 

编辑:

我想我现在明白了。在这里,我使用 计算“当前 + 下一个 4 天的平均值” date,然后将其重命名start_date以加入原始数据。

library(dplyr); library(slider)
xdata %>%
  filter(!is.na(start_date)) %>%
  mutate(avg = slide_index_dbl(values, date, .after = 4, mean)) %>%
  select(start_date = date, avg) %>% 
  right_join(xdata ) %>% 
  select(date, values, everything()) %>%
  arrange(date) %>% View()

推荐阅读