请考虑以下Tibble:

  df <- tribble(
    ~dt, ~value, ~avg,
    make_date(2023-08-01),1,NA,
    make_date(2023,08,02),2,1,
    make_date(2023,08,04),3,1.5,
    make_date(2023,08,07),4,3,
    make_date(2023,08,08),5,4,
    make_date(2023,08,09),6,4.5,
    make_date(2023,08,10),7,5,
    make_date(2023,08,11),8,6,
    make_date(2023,08,12),9,7
  )  

我想计算三天内所有记录的平均值prior的dt次方.例如,在2023-08-04,我对2023-08-03、2023-08-02和2023-08-01的值取平均值,这些值为NA,2,1,因此这些(na.rm)值的平均值为1.5.

因此,在本例中,我想添加列‘avg’:

  dt         value   avg
<date>       <dbl>  <dbl>
2014-01-01     1     NA  
2023-08-02     2     1  
2023-08-04     3     1.5
2023-08-07     4     3  
2023-08-08     5     4  
2023-08-09     6     4.5
2023-08-10     7     5  
2023-08-11     8     6  
2023-08-12     9     7  

日期之间可能有任何大小的差距.实际的应用程序将有多个日期(以千为单位),并按主题ID(此处不包括)进行分组.对于其他窗口大小,可能需要重复之前的三天.

推荐答案

这是一种使用{lider}包中的slide_index_dbl的方法.(附注:如果加载整个{tidyVerse}包,则不需要使用命名空间::调用lubridate函数,这里只是为了显式地这样做.)

library(tidyverse)

dat <- tibble(
  dt = lubridate::ymd(c(
    "2023-08-01", "2023-08-02", "2023-08-04", "2023-08-07", "2023-08-08",
    "2023-08-09", "2023-08-10", "2023-08-11", "2023-08-12", "2023-08-16",
    "2023-08-17", "2023-08-18"
    )),
  value = 1:12
  )

dat %>% 
  mutate(
    res = slider::slide_index_dbl(
      .x = value, 
      .i = dt, 
      .f = ~ mean(.x, na.rm = TRUE),
      .before = lubridate::days(3),
      .after = lubridate::days(-1)
    )
  )

R相关问答推荐

高质量地将R格式的图表从Word中输出

过滤矩阵以获得R中的唯一组合

无法运行通过R中的Auto.arima获得的ARIMA模型

咕噜中的元素列表:map

矩阵%*%矩阵中的错误:需要数字/复杂矩阵/向量参数

是否可以创建一个ggplot与整洁判断的交互作用

传递ggplot2的变量作为函数参数—没有映射级别以正确填充美学

通过在colname中查找其相应值来创建列

迭代到DataFrame列并获得成对的值列表(col1->;col2、col2->;col3、col3->;col4等)的正确方法.

SHINY:使用JS函数应用的CSS样式显示HTML表格

如何基于两个条件从一列中提取行

如何在R中通过多个变量创建交叉表?

将多个列值转换为二进制

在R中,如何从一系列具有索引名的变量快速创建数据帧?

将统计检验添加到GGPUBR中的盒图,在R

随机将数据帧中特定列上的某些行设置为NA

Ggplot2如何找到存储在对象中的残差和拟合值?

Package emMeans:如果emmip模型中包含的变量较少,emMeans模型中的其他变量设置为什么?

列间序列生成器的功能

将`magick`对象转换为原始向量