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

时间:2018-02-25 17:40:11

标签: r cumsum

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

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

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

    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)

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

我将data.table用于cumsum。计算累积均值有点棘手,因为仅使用cummean不能调整oberservations的数量。

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.table shift功能。