繁体   English   中英

根据不同的日期列计算两个日期之间的变量平均值

[英]Calculate average of variable between two dates based on a different date column

我有一个类似于下面的 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()

这会在开始日期的月份与日期月份相同的行中放置一个 NA。 请注意,在您的玩具数据集中,这些天总是相隔 7 天,因此代码实际上并没有捕获接下来五天的任何天。

val=numeric()
for (i in 1:nrow(xdata)) {
  if (is.na(xdata$start_date[i]) | month((xdata$date)[i])==month((xdata$start_date)[i])) {
    val[i]=NA
  } else {
    dat=filter(xdata, start_date >= (xdata$start_date)[i] & start_date<= (xdata$start_date)[i]+5)
    val[i]=mean(dat$values)
  }
}
xdata2=mutate(xdata, val)

这是一种使用slider的方法,这对于像这样的窗口计算非常有用。 我不知道如何为 NA start_date 行跳过 slider 计算,因此这会将它们过滤掉,然后通过连接将它们带回:

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) 

编辑:

我想我现在明白了。 在这里,我使用date计算“当前 + 下一个 4 天的平均值”,然后重命名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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM