R中具有多个条件的累积和?

问题描述 投票:2回答:2

我正在尝试根据一些条件来确定如何在R中创建累加或滚动总和。

所讨论的数据是对图书馆借阅的几百万次观察,而问题是要确定满足需求所需的给定书籍/书名的副本数。

因此,对于每个Title.ID,对于第一个实例(ID.Index),应从1个副本开始。然后,对于之后的每个实例,根据REQUEST.DATE是否在上一个请求的16周(112天)之内,确定是否需要另一个副本。

# A tibble: 15 x 3
# Groups:   Title.ID [2]
   REQUEST.DATE Title.ID ID.Index
   <date>          <int>    <int>
 1 2013-07-09          2        1
 2 2013-08-07          2        2
 3 2013-08-20          2        3
 4 2013-09-08          2        4
 5 2013-09-28          2        5
 6 2013-12-27          2        6
 7 2014-02-10          2        7
 8 2014-03-12          2        8
 9 2014-03-14          2        9
10 2014-08-27          2       10
11 2014-04-27          6        1
12 2014-08-01          6        2
13 2014-11-13          6        3
14 2015-02-14          6        4
15 2015-05-14          6        5

棘手的部分是,不仅根据请求数(ID.Index)和某些先前贷款的REQUEST.DATE来确定是否需要新副本,还取决于先前的累计金额。

例如,对于标题2的第三个请求(Title.ID 2,ID.Index 3),现在有两个副本,因此要确定是否需要新副本,必须查看REQUEST.DATE是否为在first(不是second)请求(ID.Index 1)的112天内。相比之下,对于标题6的第三次请求(Title.ID 6,ID.Index 3),只有一个副本可用(因为请求2不在112天内),因此基于以下条件确定是否需要新副本:回顾ID.Index 2的REQUEST.DATE。

所需的输出(“副本”)将接受每个新请求(ID.Index),然后根据可用副本的数量回头查看相关的REQUEST.DATE,这样做意味着查看该副本的累加总和。之前的计算。 (注意:最大份数为10。)

我已为以下示例提供了所需的输出(“副本”)。

# A tibble: 15 x 4
# Groups:   Title.ID [2]
   REQUEST.DATE Title.ID ID.Index Copies
   <date>          <int>    <int>  <dbl>
 1 2013-07-09          2        1      1
 2 2013-08-07          2        2      2
 3 2013-08-20          2        3      3
 4 2013-09-08          2        4      4
 5 2013-09-28          2        5      5
 6 2013-12-27          2        6      5
 7 2014-02-10          2        7      5
 8 2014-03-12          2        8      5
 9 2014-03-14          2        9      5
10 2014-08-27          2       10      5
11 2014-04-27          6        1      1
12 2014-08-01          6        2      2
13 2014-11-13          6        3      2
14 2015-02-14          6        4      2
15 2015-05-14          6        5      2
> 

我认识到解决方案将远远超出我的能力范围,因此,对于将来如何解决此类问题的任何解决方案或建议,我将深表感谢。

感谢一百万!

* 4/19更新:新示例,其中可以在延迟后添加新副本,即不按顺序添加。我还添加了显示从给定先前请求以来的天数的列,这有助于根据是否有新副本来检查是否应添加新副本。

示例2:应与第三次请求一起添加新副本,因为自上次请求以来只有96天(并且只有一本)

REQUEST.NUMBER REQUEST.DATE Title.ID ID.Index Days.Since Days.Since2 Days.Since3 Days.Since4 Days.Since5 Copies
  <fct>          <date>          <int>    <int> <drtn>     <drtn>      <drtn>      <drtn>      <drtn>       <int>
1 BRO-10680332   2013-10-17          6        1  NA days    NA days     NA days     NA days     NA days         1
2 PEN-10835735   2014-04-27          6        2 192 days    NA days     NA days     NA days     NA days         1
3 PEN-10873506   2014-08-01          6        3  96 days   288 days     NA days     NA days     NA days         1
4 PEN-10951264   2014-11-13          6        4 104 days   200 days    392 days     NA days     NA days         1
5 PEN-11029526   2015-02-14          6        5  93 days   197 days    293 days    485 days     NA days         1
6 PEN-11106581   2015-05-14          6        6  89 days   182 days    286 days    382 days    574 days         1

示例3:由于有两个副本,所以最后一个请求应该添加新副本,而最早的请求是45天。

REQUEST.NUMBER REQUEST.DATE Title.ID ID.Index Days.Since Days.Since2 Days.Since3 Days.Since4 Days.Since5 Copies
  <fct>          <date>          <int>    <int> <drtn>     <drtn>      <drtn>      <drtn>      <drtn>       <int>
1 BRO-10999392   2015-01-20         76        1  NA days    NA days     NA days     NA days     NA days         1
2 YAL-11004302   2015-01-22         76        2   2 days    NA days     NA days     NA days     NA days         2
3 COR-11108471   2015-05-18         76        3 116 days   118 days     NA days     NA days     NA days         2
4 HVD-11136632   2015-07-27         76        4  70 days   186 days    188 days     NA days     NA days         2
5 MIT-11164843   2015-09-09         76        5  44 days   114 days    230 days    232 days     NA days         2
6 HVD-11166239   2015-09-10         76        6   1 days    45 days    115 days    231 days    233 days         2

我正在尝试根据一些条件来确定如何在R中创建累加或滚动总和。有问题的数据集是对图书馆借贷的几百万次观察,问题是……

r cumsum rolling-sum
2个回答
0
投票

您可以使用runner包在cumulative window上应用任何R功能。这次我们使用f执行函数x = REQUEST.DATE。我们只计算在min(x) + 112内的观测值的数量。


0
投票

我能够根据每个标题在请求后112天内(创建返回日期之后)找到其他请求的最大数量,找到可行的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.