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
但是我无法弄清楚如何实现这一点。
答案 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
。