具有滞后性的 ID 累计和

cumulative sum by ID with lag

我想通过id创建一个累计金额。但是,它不应该对属于正在计算的行的值求和。

我已经尝试过 cumsum。但是,我不知道如何添加一条语句,指定不添加求和所在行的金额。我要查找的结果列是名为:"sum" 的第三列。

例如,对于id 1,第一行是sum=0,因为不应该添加这一行。但是,对于 id 1 和第 2 行 sum=100 因为第 2 行之前的 id 1 的数量是 100 等等。

   id amount sum
1:  1    100   0
2:  1     20 100
3:  1    150 120
4:  2     60   0
5:  2    100  60
6:  1     30 270
7:  2     40 160 

这是我试过的:

  df[,sum:=cumsum(amount),
      by ="id"] 

  data: df <- data.table(id = c(1, 1, 1, 2, 2,1,2), amount = c(100, 20, 
  150,60,100,30,40),sum=c(0,100,120,0,60,270,160) ,stringsAsFactors = 
  FALSE)

dplyr-

df %>% 
  group_by(id) %>% 
  mutate(sum = lag(cumsum(amount), default = 0)) %>% 
  ungroup()

# A tibble: 7 x 3
     id amount   sum
  <dbl>  <dbl> <dbl>
1     1    100     0
2     1     20   100
3     1    150   120
4     2     60     0
5     2    100    60
6     1     30   270
7     2     40   160

感谢@thelatemail 这里是 data.table 版本 -

df[, sum := cumsum(shift(amount, fill=0)), by=id]

您可以使用 lag 函数移动求和的值。

library(tidyverse)

df <- data.frame(id = c(1, 1, 1, 2, 2,1,2), amount = c(100, 20, 
150,60,100,30,40),sum=c(0,100,120,0,60,270,160) ,stringsAsFactors = 
FALSE)

df %>% 
    group_by(id) %>% 
    mutate(sum = cumsum(lag(amount, 1, default=0)))

# A tibble: 7 x 3
# Groups:   id [2]
     id amount   sum
  <dbl>  <dbl> <dbl>
1     1    100     0
2     1     20   100
3     1    150   120
4     2     60     0
5     2    100    60
6     1     30   270
7     2     40   160

您可以在不使用 lag 的情况下执行此操作:

> df %>%
      group_by(id) %>%
      mutate(sum = cumsum(amount) - amount)
# A tibble: 7 x 3
# Groups:   id [2]
     id amount   sum
  <dbl>  <dbl> <dbl>
#1    1    100     0
#2    1     20   100
#3    1    150   120
#4    2     60     0
#5    2    100    60
#6    1     30   270
#7    2     40   160

这是base R

中的一个选项
df$Sum <- with(df, ave(amount, id, FUN = cumsum) - amount)
df$Sum
#[1]   0 100 120   0  60 270 160

或者删除最后一个观察值,取 cumsum

with(df, ave(amount, id, FUN  = function(x) c(0, cumsum(x[-length(x)]))))