首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中按日期范围创建虚拟变量

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

Stack Overflow用户
提问于 2017-09-07 07:41:05
回答 1查看 646关注 0票数 0

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

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

代码语言:javascript
复制
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

我想为数据框架“购买”中的每个版本创建虚拟变量,根据该版本生效的日期范围。也就是说,如果购买的时间戳在该版本生效的日期范围内,则该版本假名=1否则为0。

代码语言:javascript
复制
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 
....

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-07 08:39:34

该任务可分为两个子任务:

  1. 找到最新的Release_Date之前的TIMESTAMP购买,
  2. 重塑从长到宽的格式。

为了找到最新的版本,data.table包提供了两种可能性,

滚动连接

代码语言:javascript
复制
library(data.table)
setDT(Version)
setDT(Purchases)

Version[Purchases, on = .(Release_Date = TIMESTAMP), roll = TRUE,
        .(TIMESTAMP = i.TIMESTAMP, Amount, Version)]

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

或者一个非马的加入。

代码语言:javascript
复制
Version[Purchases, on = .(Release_Date <= TIMESTAMP), mult = "last",
        .(TIMESTAMP = i.TIMESTAMP, Amount, Version)]

产生同样的结果。

为了进行重组,dcast()函数与length()一起用于聚合:

代码语言:javascript
复制
# 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

或者,如果这些列在重塑过程中被重命名

代码语言:javascript
复制
# 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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46090658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档