【发布时间】:2021-03-01 21:52:57
【问题描述】:
我有一个类似于下面的 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 的范围定义的日期之间的平均值的最佳方法是什么?
谢谢,
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()
【问题讨论】:
-
我不确定我是否理解了这个问题。当开始日期月份与日期月份匹配时,输出应该是什么?你希望输出是什么样的?能举个例子吗?
-
谢谢乔恩。当 month(start_date) != month(date) 我想计算从 start_date 开始的 5 天内变量“值”的平均值。