如何获取data.table中日期的差异

时间:2016-02-10 06:42:28

标签: r data.table

data.table看起来像这样

              AccId  Balance BusinessDate flag_change
             (fctr)    (dbl)       (fctr)       (dbl)
1  00000252-MMM-140 23550.85   2012-04-30           1
2  00000252-MMM-140 23567.20   2012-05-31           1
3  00000252-MMM-140 23579.49   2012-06-30           1
4  00000252-MMM-140 23591.20   2012-07-31           1
5  00000252-MMM-140 23603.89   2012-08-31           1
6  00000252-MMM-140 23629.67   2012-09-30           1
7  00000252-MMM-140 23642.15   2012-10-31           1
8  00000252-MMM-140 23642.15   2012-11-30           0
9  00000252-MMM-140 23652.26   2012-12-31           1
10 00000252-MMM-140 23652.26   2013-01-01           0

现在我想计算帐户余额变更的日期。理想情况下,我需要的是一个列,其中包含每个BusinessDate的日期差异,以及每个accID的余额变化,如果它在下一个BusinessDate中没有更改,就像下面那样会有0和它将进入下一个工作日并计算差异。在下面的例子中我想要

1  00000252-MMM-140 23550.85   2012-04-30           1    1
2  00000252-MMM-140 23567.20   2012-05-31           1   31
3  00000252-MMM-140 23579.49   2012-06-30           1   30
4  00000252-MMM-140 23591.20   2012-07-31           1   31
5  00000252-MMM-140 23603.89   2012-08-31           1   31
6  00000252-MMM-140 23629.67   2012-09-30           1   30
7  00000252-MMM-140 23642.15   2012-10-31           1   31
8  00000252-MMM-140 23642.15   2012-11-30           0    0
9  00000252-MMM-140 23652.26   2012-12-31           1   61

但是我无法弄清楚如何实现这一点。

1 个答案:

答案 0 :(得分:3)

我们可以将'data.frame'转换为'data.table',将'BusinessDate'更改为Date类。获取相邻'BusinessDate'与diff之间的区别,其中'flag_change`不等于0。

library(data.table)
setDT(df1)[, BusinessDate:= as.Date(BusinessDate)]
df1[flag_change!=0, Diff:= c(1,diff(BusinessDate)), by =  AccId]
head(df1,-1)
#              AccId  Balance BusinessDate flag_change Diff
# 1: 00000252-MMM-140 23550.85   2012-04-30           1    1
# 2: 00000252-MMM-140 23567.20   2012-05-31           1   31
# 3: 00000252-MMM-140 23579.49   2012-06-30           1   30
# 4: 00000252-MMM-140 23591.20   2012-07-31           1   31
# 5: 00000252-MMM-140 23603.89   2012-08-31           1   31
# 6: 00000252-MMM-140 23629.67   2012-09-30           1   30
# 7: 00000252-MMM-140 23642.15   2012-10-31           1   31
# 8: 00000252-MMM-140 23642.15   2012-11-30           0   NA
# 9: 00000252-MMM-140 23652.26   2012-12-31           1   61

编辑:根据@ K.Rohde的评论添加by = AccId