【问题标题】:Cumsum based on date and ID基于日期和 ID 的 Cumsum
【发布时间】:2019-10-30 20:05:03
【问题描述】:

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

与这个问题非常相似: cumsum() up to and including current date in dplyr

这是当前代码:

library(dplyr)
tribble(~ID,~Date, ~value,
        "ID-1", "2019-01-01", 50,
        "ID-2", "2019-01-02", 20,
        "ID-3", "2019-01-03", 35,
        "ID-1", "2019-01-04", 0,
        "ID-4", "2019-01-04", 20,
        "ID-5", "2019-01-04", 25,
        "ID-6", "2019-01-07", 100,
        "ID-3", "2019-01-08", 0,
        "ID-7", "2019-01-08", 15,
        "ID-8", "2019-01-08", 10,
        "ID-6", "2019-01-10", 0,
        "ID-9", "2019-01-10", 45,
        "ID-10", "2019-01-10", 40) %>% arrange(Date) %>%  mutate(run_sum=cumsum(value)) %>% group_by(Date) %>% mutate(run_sum = last(run_sum))

输出:

# A tibble: 13 x 4
# Groups:   Date [7]
   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     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    15     275
10 ID-8  2019-01-08    10     275
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

当新的 ID 更新发生时,run_sum 在哪里过滤掉旧的 ID 重复值?

【问题讨论】:

  • 您能否提供具体的计算方法?比方说,第 5 行的 run_sum 是如何计算的?

标签: r date dplyr


【解决方案1】:

好吧,这是一种方法,首先我们按 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 是没有run_sum 值的数据的地方

【讨论】:

    猜你喜欢
    • 2021-06-04
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    相关资源
    最近更新 更多