R 基于日期和ID的总和

R 基于日期和ID的总和,r,date,dplyr,R,Date,Dplyr,我有一个数据帧作为变更日志。我想将当前日期和之前所有日期的值累加起来,过滤掉旧的重复ID 与此问题非常相似: 以下是当前代码: 产出: #一个tible:13 x 4 #分组:日期[7] ID日期值运行和 1 ID-1 2019-01-01 50 2 ID-2 2019-01-02 20 70 3 ID-3 2019-01-03 35 105 4 ID-1 2019-01-04 0 150 5 ID-4 2019-01-04 20 150 6 ID-5 2019-01-04 25 150 7

我有一个数据帧作为变更日志。我想将当前日期和之前所有日期的值累加起来,过滤掉旧的重复ID

与此问题非常相似:

以下是当前代码: 产出:
#一个tible:13 x 4
#分组:日期[7]
ID日期值运行和
1 ID-1 2019-01-01 50
2 ID-2 2019-01-02 20 70
3 ID-3 2019-01-03 35 105
4 ID-1 2019-01-04 0 150
5 ID-4 2019-01-04 20 150
6 ID-5 2019-01-04 25 150
7 ID-6 2019-01-07 100 250
8 ID-3 2019-01-08 0 275
9 ID-7 2019-01-08 15275
10 ID-8 2019-01-08 10275
11 ID-6 2019-01-10 0 360
12 ID-9 2019-01-10 45 360
13 ID-10 2019-01-10 40 360
有什么好方法可以让run_sum列看起来像这样吗

# A tibble: 13 x 4
   ID    Date       value run_sum
   <chr> <chr>      <dbl>   <dbl>
 1 ID-1  2019-01-01    50      50
 2 ID-2  2019-01-02    20      70
 3 ID-3  2019-01-03    35     105
 4 ID-1  2019-01-04     0     100
 5 ID-4  2019-01-04    20     100
 6 ID-5  2019-01-04    25     100
 7 ID-6  2019-01-07   100     200
 8 ID-3  2019-01-08     0     190
 9 ID-7  2019-01-08    15     190
10 ID-8  2019-01-08    10     190
11 ID-6  2019-01-10     0     175
12 ID-9  2019-01-10    45     175
13 ID-10 2019-01-10    40     175
#一个tible:13 x 4
ID日期值运行和
1 ID-1 2019-01-01 50
2 ID-2 2019-01-02 20 70
3 ID-3 2019-01-03 35 105
4 ID-1 2019-01-04 0 100
5 ID-4 2019-01-04 20 100
6 ID-5 2019-01-04 25 100
7 ID-6 2019-01-07 100 200
8 ID-3 2019-01-08 0 190
9 ID-7 2019-01-08 15 190
10 ID-8 2019-01-08 10 190
11 ID-6 2019-01-10 0 175
12 ID-9 2019-01-10 45 175
13 ID-10 2019-01-10 40 175

当一个新的ID更新发生时,运行和会过滤掉旧的ID重复值吗?

好吧,这里有一种方法,首先我们按ID查看值,并使用
ival
跟踪和前一个值的差异。然后我们再次按日期查看,对于每个日期组,找到值的总变化。然后,我们只保留该组中第一行的值更改。然后我们可以在该列上运行一个累积和,以获得我们想要的值

dd %>% group_by(ID) %>% 
  mutate(ival=value-lag(value,default=0)) %>% 
  group_by(Date) %>% 
  mutate(diff = sum(ival)) %>% 
  mutate(diff = diff * (row_number()==1)) %>% # only keep first
  ungroup() %>% 
  mutate(run_sum = cumsum(diff)) %>% 
  select(-ival, -diff)

#    ID    Date       value run_sum
#    <chr> <chr>      <dbl>   <dbl>
#  1 ID-1  2019-01-01    50      50
#  2 ID-2  2019-01-02    20      70
#  3 ID-3  2019-01-03    35     105
#  4 ID-1  2019-01-04     0     100
#  5 ID-4  2019-01-04    20     100
#  6 ID-5  2019-01-04    25     100
#  7 ID-6  2019-01-07   100     200
#  8 ID-3  2019-01-08     0     190
#  9 ID-7  2019-01-08    15     190
# 10 ID-8  2019-01-08    10     190
# 11 ID-6  2019-01-10     0     175
# 12 ID-9  2019-01-10    45     175
# 13 ID-10 2019-01-10    40     175
dd%>%group\u by(ID)%>%
变异(ival=值滞后(值,默认值=0))%>%
分组单位(日期)%>%
变异(差异=总和(ival))%>%
变异(diff=diff*(row_number()==1))%>%#只保留第一个
解组()%>%
变异(run_sum=cumsum(diff))%>%
选择(-ival,-diff)
#ID日期值运行和
#              
#1 ID-1 2019-01-01 50
#2 ID-2 2019-01-02 20 70
#3 ID-3 2019-01-03 35 105
#4 ID-1 2019-01-04 0 100
#5 ID-4 2019-01-04 20 100
#6 ID-5 2019-01-04 25 100
#7 ID-6 2019-01-07 100 200
#8 ID-3 2019-01-08 0 190
#9 ID-7 2019-01-08 15 190
#10 ID-8 2019-01-08 10 190
#11 ID-6 2019-01-10 0 175
#12 ID-9 2019-01-10 45 175
#13 ID-10 2019-01-10 40 175

这就是
dd
是没有
run\u sum
值的数据

您能提供它的精确计算方法吗?比如说,如何计算第5行的
run\u sum
# A tibble: 13 x 4
   ID    Date       value run_sum
   <chr> <chr>      <dbl>   <dbl>
 1 ID-1  2019-01-01    50      50
 2 ID-2  2019-01-02    20      70
 3 ID-3  2019-01-03    35     105
 4 ID-1  2019-01-04     0     100
 5 ID-4  2019-01-04    20     100
 6 ID-5  2019-01-04    25     100
 7 ID-6  2019-01-07   100     200
 8 ID-3  2019-01-08     0     190
 9 ID-7  2019-01-08    15     190
10 ID-8  2019-01-08    10     190
11 ID-6  2019-01-10     0     175
12 ID-9  2019-01-10    45     175
13 ID-10 2019-01-10    40     175
dd %>% group_by(ID) %>% 
  mutate(ival=value-lag(value,default=0)) %>% 
  group_by(Date) %>% 
  mutate(diff = sum(ival)) %>% 
  mutate(diff = diff * (row_number()==1)) %>% # only keep first
  ungroup() %>% 
  mutate(run_sum = cumsum(diff)) %>% 
  select(-ival, -diff)

#    ID    Date       value run_sum
#    <chr> <chr>      <dbl>   <dbl>
#  1 ID-1  2019-01-01    50      50
#  2 ID-2  2019-01-02    20      70
#  3 ID-3  2019-01-03    35     105
#  4 ID-1  2019-01-04     0     100
#  5 ID-4  2019-01-04    20     100
#  6 ID-5  2019-01-04    25     100
#  7 ID-6  2019-01-07   100     200
#  8 ID-3  2019-01-08     0     190
#  9 ID-7  2019-01-08    15     190
# 10 ID-8  2019-01-08    10     190
# 11 ID-6  2019-01-10     0     175
# 12 ID-9  2019-01-10    45     175
# 13 ID-10 2019-01-10    40     175