首页 > 解决方案 > 在 dplyr 语句中循环平均周期

问题描述

我正在尝试计算 R dplyr 语句中滚动平均周期的变化。

    library(dplyr)

    data <- tibble(a=seq(1:1000), b=runif(1000), c=rep(c('x','y','Z','q'), 250))

    # Rolling mean calculation
    augment <- data %>% group_by(c) %>% mutate(mean = rollmean(a, 10, na.pad=TRUE, align='left')) %>%  
           ungroup() %>% drop_na() %>% group_by(c)  %>% dplyr::summarize(cor = cor(mean,b)) %>% 
           mutate(ndays = 10)

我想做的是循环/迭代 10 的滚动周期并用 seq(10,35) 替换 10。

上述语句的输出是:

# A tibble: 4 x 3
  c         cor ndays
  <chr>   <dbl> <dbl>
1 q      0.0107    10
2 x      0.0118    10
3 y     -0.0908    10
4 Z     -0.0508    10

所需的输出是一个 tibble,其中包含 10 到 35 个平均周期中每一个的 ndays 条目以及相关的相关性。

我尝试插入一个 mutate 语句来添加一个 ndays 变量,但尺寸不正确。对该尝试的不同迭代不起作用。

如何在 dplyr 和相关软件包中实现这一点?

谢谢!

标签: rdplyr

解决方案


您可以做的一件快速的事情是purrr将函数应用于从 10 到 35 的每个值:

library(tidyverse)
library(zoo)

data <- tibble(a=seq(1:1000), b=runif(1000), c=rep(c('x','y','Z','q'), 250))

10:35 %>% 
  map_df(~{
    data %>% 
      group_by(c) %>%
      mutate(mean = rollmean(a, .x, na.pad=TRUE, align='left')) %>%  
      ungroup() %>% 
      drop_na() %>% 
      group_by(c)  %>% 
      dplyr::summarize(cor = cor(mean,b)) %>% 
      mutate(ndays = .x)
  })
#> # A tibble: 104 x 3
#>    c         cor ndays
#>    <chr>   <dbl> <int>
#>  1 q      0.0519    10
#>  2 x     -0.123     10
#>  3 y      0.0347    10
#>  4 Z     -0.116     10
#>  5 q      0.0571    11
#>  6 x     -0.111     11
#>  7 y      0.0379    11
#>  8 Z     -0.124     11
#>  9 q      0.0498    12
#> 10 x     -0.103     12
#> # … with 94 more rows

reprex 包(v0.3.0)于 2020 年 4 月 2 日创建


推荐阅读