Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何获取data.table中的日期差_R_Data.table - Fatal编程技术网

R 如何获取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

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

但是我不知道如何实现这一点。

我们可以将“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。感谢您的评论。是的,应该是这样。