R 如何获取data.table中的日期差
data.table如下所示R 如何获取data.table中的日期差,r,data.table,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
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
但是我不知道如何实现这一点。我们可以将“data.frame”转换为“data.table”,将“BusinessDate”更改为
Date
类。获取具有diff
且“flag_change”不等于0的相邻“BusinessDate”之间的差值
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
。通过添加by=“AccId”
可以为每个AccId
值执行此操作。(否则在AccId
更改时会出现重叠问题。)我的意思是df1[flag_change!=0,Diff:=c(1,Diff(BusinessDate)),by=“AccId”]
@K。感谢您的评论。是的,应该是这样。