R 基于日期和ID的总和
我有一个数据帧作为变更日志。我想将当前日期和之前所有日期的值累加起来,过滤掉旧的重复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
#一个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