首页 文章

r组滞后和

提问于
浏览
4

我有一些组的数据,我想在这些组中计算固定数量的句点的摘要(总和或平均值) . 我正在尝试使用group_by,然后使用mutate,然后使用变量及其dplyr :: lag进行操作 . 这是一个例子:

library(tidyverse)
df <- data.frame(group = rep(c("A", "B"), 5), 
                  x = c(1, 3, 4, 7, 9, 10, 17, 29, 30, 55))
df %>% 
    group_by(group) %>% 
    mutate(cs = x + lag(x, 1, 0) + lag(x, 2, 0) + lag(x, 3, 0)) %>% 
    ungroup()

这产生了预期的结果:

# A tibble: 10 x 3
    group     x    cs
   <fctr> <dbl> <dbl>
 1      A     1     1
 2      B     3     3
 3      A     4     5
 4      B     7    10
 5      A     9    14
 6      B    10    20
 7      A    17    31
 8      B    29    49
 9      A    30    60
10      B    55   101

有没有更短的方法来实现这一目标? (这里我计算了四个值,但实际上我需要十二个或更多) .

1 回答

  • 6

    也许您可以使用tidyverse中包含的 purrr 函数 reducemap

    library(tidyverse)
    df <- data.frame(group = rep(c("A", "B"), 5), 
                     x = c(1, 3, 4, 7, 9, 10, 17, 29, 30, 55))
    
    df %>% 
      group_by(group) %>% 
      mutate(cs = reduce(map(0:3, ~ lag(x, ., 0)), `+`)) %>%
      ungroup()
    #> # A tibble: 10 x 3
    #>     group     x    cs
    #>    <fctr> <dbl> <dbl>
    #>  1      A     1     1
    #>  2      B     3     3
    #>  3      A     4     5
    #>  4      B     7    10
    #>  5      A     9    14
    #>  6      B    10    20
    #>  7      A    17    31
    #>  8      B    29    49
    #>  9      A    30    60
    #> 10      B    55   101
    

    要了解这里发生了什么,可能更容易看到一个不需要组的简单示例 .

    v <- 1:5
    lagged_v <- map(0:3, ~ lag(v, ., 0))
    lagged_v
    #> [[1]]
    #> [1] 1 2 3 4 5
    #> 
    #> [[2]]
    #> [1] 0 1 2 3 4
    #> 
    #> [[3]]
    #> [1] 0 0 1 2 3
    #> 
    #> [[4]]
    #> [1] 0 0 0 1 2
    
    reduce(lagged_v, `+`)
    #> [1]  1  3  6 10 14
    

相关问题