按R中的日期范围创建虚拟变量

按R中的日期范围创建虚拟变量,r,merge,dummy-variable,R,Merge,Dummy Variable,我想创建虚拟变量,根据日期范围指示哪个产品版本有效,即在发布日期和下一版本发布日期之间,而不需要手动执行。我有几百个版本及其相应的发布日期和下一个版本发布的时间,我将合并/加入此数据与购买数据框架 目前,我有两个数据帧(版本和购买),如下所示: View(Version) Type Version Release_Date Next_Release A 1.2.3 2013-11-14 2014-01-11 B 1.3.1 2014-01

我想创建虚拟变量,根据日期范围指示哪个产品版本有效,即在发布日期和下一版本发布日期之间,而不需要手动执行。我有几百个版本及其相应的发布日期和下一个版本发布的时间,我将合并/加入此数据与购买数据框架

目前,我有两个数据帧(版本和购买),如下所示:

View(Version)   
Type Version    Release_Date    Next_Release
A       1.2.3   2013-11-14     2014-01-11
B       1.3.1   2014-01-11     2014-02-20
A       1.5.1   2014-02-20     2014-03-08
A       1.5.2   2014-03-08     2014-04-06
B       1.5.3   2014-04-06     2014-04-12
A       1.5.4   2014-04-12     2014-04-15
B       1.5.5   2014-05-15     2014-05-20
B       1.6.1   2014-05-20     2014-06-26
A       1.6.2   2014-06-26     2014-07-14

View(Purchases)
TIMESTAMP   Amount 
2013-11-14   15.44
2013-11-14   13.39
2013-11-14   15.35
2013-11-15   86.43
2014-01-15   12.30
2014-01-17   23.55
我想根据版本生效的日期范围为数据框“购买”中的每个版本创建虚拟变量。i、 e.如果购买的时间戳在该版本生效的日期范围内,则该版本虚拟=1,否则为0

View(Purchases)
TIMESTAMP   Amount Version_1.2.3  Version_1.3.1  ....
2013-11-14   15.44      1              0
2013-11-14   13.39      1              0
2013-11-14   15.35      1              0
2013-11-15   86.43      1              0
2014-01-15   12.30      0              1
2014-01-17   23.55      0              1 
....

提前感谢您的任何建议或帮助

任务可分为两个子任务:

  • 查找购买的
    时间戳
    之前最近的
    发布日期
  • 从长格式改为宽格式
  • 要查找最新版本,data.table包提供了两种可能性

    滚动接头

    还是非等联接

    或者,如果立柱在重塑过程中需要重新命名

    # non-equi join
    Version[Purchases, on = .(Release_Date <= TIMESTAMP), mult = "last",
            .(TIMESTAMP = i.TIMESTAMP, Amount, Version)][
      , dcast(.SD, TIMESTAMP + Amount ~ paste0("Version_", Version), length)]
    

    您是否曾经尝试过逐个计算指标列?
        TIMESTAMP Amount Version
    1: 2013-11-14  15.44   1.2.3
    2: 2013-11-14  13.39   1.2.3
    3: 2013-11-14  15.35   1.2.3
    4: 2013-11-15  86.43   1.2.3
    5: 2014-01-15  12.30   1.3.1
    6: 2014-01-17  23.55   1.3.1
    
    Version[Purchases, on = .(Release_Date <= TIMESTAMP), mult = "last",
            .(TIMESTAMP = i.TIMESTAMP, Amount, Version)]
    
    # rolling join
    Version[Purchases, on = .(Release_Date = TIMESTAMP), roll = TRUE,
            .(TIMESTAMP = i.TIMESTAMP, Amount, Version)][
      , dcast(.SD, TIMESTAMP + Amount ~ Version, length)]
    
        TIMESTAMP Amount 1.2.3 1.3.1
    1: 2013-11-14  13.39     1     0
    2: 2013-11-14  15.35     1     0
    3: 2013-11-14  15.44     1     0
    4: 2013-11-15  86.43     1     0
    5: 2014-01-15  12.30     0     1
    6: 2014-01-17  23.55     0     1
    
    # non-equi join
    Version[Purchases, on = .(Release_Date <= TIMESTAMP), mult = "last",
            .(TIMESTAMP = i.TIMESTAMP, Amount, Version)][
      , dcast(.SD, TIMESTAMP + Amount ~ paste0("Version_", Version), length)]
    
        TIMESTAMP Amount Version_1.2.3 Version_1.3.1
    1: 2013-11-14  13.39             1             0
    2: 2013-11-14  15.35             1             0
    3: 2013-11-14  15.44             1             0
    4: 2013-11-15  86.43             1             0
    5: 2014-01-15  12.30             0             1
    6: 2014-01-17  23.55             0             1