如何计算由不同列定义的间隔的累积和?

时间:2018-02-16 21:59:21

标签: r dplyr

我想计算一列中的累计数字总和,其中要求和的矢量的长度是可变的,并由另一列中的值定义。

一个例子:

ti <- tibble(group = c(rep("A", 18), rep("B", 18)),
             year = c(1990:2007,1991:2008),
             x = c(NA, NA, NA, 20, NA, NA, NA, 15, NA, NA, NA, 3, 5, NA, 9, NA, NA, 20,
                   20, NA, 17, NA, NA, NA, 30, 10, NA, NA, NA, 8, 17, NA, NA, NA, NA, 30),
             y = c(sample(1:100, 18), sample(1:100, 18)))

enter image description here

我想在x为非NA的行中得到y的累积和,即

enter image description here

理想情况下,解决方案应使用%&gt;%和group_by。

非常感谢!

1 个答案:

答案 0 :(得分:0)

此解决方案应该有效。

library(dplyr)
set.seed(220)

ti <- tibble(group = c(rep("A", 18), rep("B", 18)),
             year = c(1990:2007,1991:2008),
             x = c(NA, NA, NA, 20, NA, NA, NA, 15, NA, NA, NA, 3, 5, NA, 9, NA, NA, 20,
                   20, NA, 17, NA, NA, NA, 30, 10, NA, NA, NA, 8, 17, NA, NA, NA, NA, 30),
             y = c(sample(1:100, 18), sample(1:100, 18)))

ti %>% 
  group_by(group) %>% 
  mutate(y =  cumsum(y)) %>% 
  filter(!is.na(x))

#> # A tibble: 13 x 4
#> # Groups:   group [2]
#>    group  year     x     y
#>    <chr> <int> <dbl> <int>
#>  1     A  1993    20   203
#>  2     A  1997    15   458
#>  3     A  2001     3   621
#>  4     A  2002     5   636
#>  5     A  2004     9   761
#>  6     A  2007    20   906
#>  7     B  1991    20    15
#>  8     B  1993    17   104
#>  9     B  1997    30   409
#> 10     B  1998    10   457
#> 11     B  2002     8   595
#> 12     B  2003    17   694
#> 13     B  2008    30   888