【问题标题】:r group lag sumr 组滞后总和
【发布时间】:2018-05-07 21:18:16
【问题描述】:

我有一些组数据,我想在固定数量的周期内为其计算汇总(总和或平均值)。我正在尝试使用 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

有没有更短的方法来完成这个? (这里我计算了四个值,但实际上我需要十二个或更多)。

【问题讨论】:

  • 您希望整个团队都使用它吗?喜欢cumsum?还是仅仅落后了 x 个周期?

标签: r dplyr lag tidyverse


【解决方案1】:

也许您可以使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多