更新或添加值以聚合 data.frame

Update or add value to aggregate in data.frame

假设我有以下简单的data.frame

    ID  value
1    1    3
2    2    4
3    1    5
4    3    3

我想要的输出如下,我们将 value 添加到 cumsum 或我们根据已使用的 ID 的最新 value 对其进行更新。

    ID  value  cumsum
1    1    3       3
2    2    4       7
3    1    5       9
4    3    3       12

在第 3 行中,新的 value 形成更新的 cumsum (7-3+5=9)。第 4 行将新的 value 添加到 cumsum 因为 ID(4+5+3=12).

之前没有被使用

这会为您的示例生成所需的结果:

df<-read.table(header=T, text="ID  value
1    1    3
2    2    4
3    1    5
4    3    3")
library(tidyverse)
df %>% 
  group_by(ID) %>% 
  mutate(value = value-lag(value, def = 0L)) %>% 
  ungroup %>% mutate(cumsum = cumsum(value)) 
# # A tibble: 4 x 3
#      ID value cumsum
#   <int> <int>  <int>
# 1     1     3      3
# 2     2     4      7
# 3     1     2      9
# 4     3     3     12

我用 data.table 代替 cumsum。计算累积平均值有点棘手,因为仅使用 cummean.

无法调整观察次数
library(data.table)
dt = data.table(id = c(1, 2, 1, 3), value = c(3, 4, 5, 3))

dt[, tmp := value-shift(value, n = 1L, type = "lag", fill = 0), by = c("id")]

#CUMSUM
dt[, cumsum := cumsum(tmp)]

#CUMMEAN WITH UPDATED N
dt[value != tmp, skip := 1:.N]
dt[, skip := na.locf(skip, na.rm = FALSE)]
dt[is.na(skip), skip := 0]
dt[, cummean := cumsum(tmp)/(seq_along(tmp)-skip)]

输出为:

       id value tmp cumsum skip cummean
   1:  1     3   3      3    0     3.0
   2:  2     4   4      7    0     3.5
   3:  1     5   2      9    1     4.5
   4:  3     3   3     12    1     4.0

编辑:将 lag 函数更改为 data.tableshift 函数。