问题描述
这是我的交易数据。它显示了从from
列中的帐户到to
列中的帐户的交易,并带有日期和金额信息
data
id from to date amount
<int> <fctr> <fctr> <date> <dbl>
19521 6644 6934 2005-01-01 700.0
19524 6753 8456 2005-01-01 600.0
19523 9242 9333 2005-01-01 1000.0
… … … … …
1056317 7819 7454 2010-12-31 60.2
1056318 6164 7497 2010-12-31 107.5
1056319 7533 7492 2010-12-31 164.1
现在我要做的是:我想逐行查看每个交易,对于from
列中的每个帐户,我想跟踪过去6笔交易中收到的交易金额进行特定交易时的月份,并希望将此信息另存为新列。(因此此新列将描述交易前最近六个月from
列中的帐户收到的总交易金额日期。)
例如:
在第一行数据中,对于帐户6644
,如果to
在6644
这两个月的两个日期之间进行了交易,我应该查看"2004-07-05"-"2005-01-01"
列直到2005-01-01
进行交易的日期6644
为止的期间。如果有6644
收到的交易,则应将它们汇总,然后将此总和信息作为值添加到新列total_trx_amount_received_in_last_6month
中。同样,我应该对帐户6753
执行相同的操作
并查找在日期"2004-07-05"-"2005-01-01"
之间获得的交易,并将其加总并加到total_trx_amount_received_in_last_6month
列中。
而且,我应该以这种方式在数据中逐行继续。
那么,如何才能实现整个数据呢?
PS:在日期间隔"2004-07-05"-"2005-01-01"
中,"2005-01-01"
是交易日期,要获取第二个日期"2004-07-05"
,我将从交易日期{减去180天(约6个月) {1}}。
为了更好地查看,我提供了以下数据:
我还将显示输出结果。假设我们只有这么多交易。只需在这里考虑"2005-01-01"
帐户,因为其他帐户5370
在这里没有任何交易。
8605,6390,8934
这是我所做的:
首先请注意,上面的这些小数据按id from to date amount total_trx_amount_received_in_last_6month
<int> <fctr> <fctr> <date> <dbl> <dbl>
18529 5370 9356 2005-05-31 24.4 0.0
13742 5370 5605 2005-08-05 7618.0 0.0
9913 5370 8567 2005-09-12 21971.0 0.0
956 8605 5370 2005-10-05 5245.0 0.0
2557 5370 5636 2005-11-12 2921.0 5245.0
1602 6390 5370 2005-11-26 8000.0 0.0
18669 5370 8933 2005-11-30 169.2 (5245.0+8000.0)=13245
35900 5370 8483 2006-01-31 71.5 (5245.0+8000.0)=13245
48667 8934 5370 2006-03-31 14.6 0.0
51341 5370 7626 2006-04-11 4214.0 (8000.0+14.6)=8014.6
的升序排序。
在第一行中,对于date
中的帐户5370
,我查看了过去的数据以查看from column
在日期5370
之间是否有任何交易。由于第一行是第一笔交易,显然"2004-12-02"-"2005-05-31"
在日期5370
之前没有收到任何交易,因此我分别将"2005-05-31"
登录到0.0
列中。在第二行中,对于total_trx_amount_received_in_last_6month
中的帐户5370
,from column
在日期5370
之间没有收到任何交易,因此我将"2005-02-06"-"2005-08-05"
登录到{ {1}}列。同样,我分别在第三行和第四行中分别为帐户0.0
和total_trx_amount_received_in_last_6month
登录0.0
。在第五行中,对于5370
中的帐户8605
,5370
在日期from column
之间收到了一笔交易,该交易在5370
(在数据的第4行)的数量为"2005-05-16"-"2005-11-12"
,因此我将"2005-10-05"
登录到5245.0
列中。在第六行中,对于5245.0
中的帐户total_trx_amount_received_in_last_6month
,6390
在日期from column
之间没有收到任何交易,因此我将6390
登录到{{ 1}}列。数据的所有行都是这样。
dput()数据输出:
"2005-05-30"-"2005-11-26"
(我将0.0
和total_trx_amount_received_in_last_6month
列转换为字符,因为它们具有大量的级别,否则输出将占用太多空间)
解决方法
我们可以使用map2_dbl
并取6个月范围内的sum
中的amount
。
library(dplyr)
library(purrr)
data %>%
mutate(amt = map2_dbl(from,date,~sum(amount[to == .x & between(date,.y - 180,.y)])))