在data.frame中更新或添加聚合值

在data.frame中更新或添加聚合值,r,cumsum,R,Cumsum,假设我有以下简单的data.frame: ID value 1 1 3 2 2 4 3 1 5 4 3 3 下面是我想要的输出,我们向cumsum添加值,或者根据已经使用的ID的最新值更新它 ID value cumsum 1 1 3 3 2 2 4 7 3 1 5 9 4 3 3 12 在第3行中,新的值形成一个更新的总和(7

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

    ID  value
1    1    3
2    2    4
3    1    5
4    3    3
下面是我想要的输出,我们向
cumsum
添加
,或者根据已经使用的
ID
的最新
值更新它

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

在第3行中,新的
形成一个更新的
总和
(7-3+5=9)
。第4行将一个新的
值添加到
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
df%
分组依据(ID)%>%
突变(值=值滞后(值,def=0L))%>%
解组%>%变异(总和=总和(值))
##tibble:4 x 3
#ID值总和
#      
# 1     1     3      3
# 2     2     4      7
# 3     1     2      9
# 4     3     3     12

我使用了
数据。表
用于
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
功能更改为
数据。表
shift
功能。

工作正常,谢谢!有没有办法让它也能与
cummean
一起使用?似乎n没有更新。@Stefan您可以添加一个包含输入、代码和预期输出的示例吗?