r - 根据不同的日期列计算两个日期之间的变量平均值
问题描述
我有一个类似于下面的 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()
解决方案
这是一种使用 的方法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()
推荐阅读
- typescript - 有没有办法描述 TypeScript 中两个参数之间的关系?
- service-worker - service-worker.js 中未捕获的 promise DOM 异常
- python-3.x - 为 max(max(x, key=len )) 和 max( max(i) for i in x) 获得不同的结果
- azure-devops - Power BI Desktop 中消失的关系
- reactjs - 如果反应组件重新渲染是否意味着该组件中的所有代码都重新运行?
- git - vimdiff 不能用作 'vim'
- raspberry-pi3 - 将 3 个树莓派连接到 VNC
- python - 检查文本文件的内容,如果不存在则添加内容
- python - “单击按钮后 GUI 变得无响应”
- javascript - How can I rewrite my method to async/await?