【问题标题】:Loop over averaging period within dplyr statement在 dplyr 语句中循环平均周期
【发布时间】:2020-04-02 16:46:07
【问题描述】:

我正在尝试计算 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 和相关包中实现这一点?

谢谢!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您可以做的一个快速的事情是使用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 package (v0.3.0) 于 2020 年 4 月 2 日创建

    【讨论】:

    • 太棒了。它工作得很好,我不必使用 for 循环。感谢您的意见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多