【问题标题】:How to get the difference of dates inside a data.table如何获取 data.table 中的日期差异
【发布时间】:2016-02-10 06:42:27
【问题描述】:

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

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

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我们可以将 '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 的 cmets 添加了 by = AccId。

    【讨论】:

    • 通过添加by = "AccId",您可以为每个AccId 值执行此操作。 (否则AccId变化时会出现重叠问题。)
    • 我的意思是df1[flag_change!=0, Diff:= c(1,diff(BusinessDate)), by = "AccId"]
    • @K.Rohde 感谢您的评论。是的,应该是这样的。
    猜你喜欢
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 2020-12-20
    • 1970-01-01
    相关资源
    最近更新 更多