我正在尝试查找和合并我在多个标准上的两个数据框,并且在理解它时遇到很多麻烦.
我有两组数据,一个我想索引,包含一些产品的有效日期,另一组给我产品使用,如下:
Indexset <- data.table(validfrom=as.Date(c("2015-08-01", "2015-08-02", "2015-08-03", "2015-08-04")),
validto=as.Date(c("2015-08-07", "2015-08-08","2015-08-09", "2015-08-10")),
username=c("Smith", "Cole", "Amos", "Richardson"),
productcode=c(1,2,3,4))
Useset <- data.table(usedate=as.Date(c("2015-08-04", "2015-08-06", "2015-08-06", "2015-08-09")),
username=c("Smith", "Richardson", "Cole", "Amos"))
Run Code Online (Sandbox Code Playgroud)
我要做的是在'Useset'中添加一个列,其中包含'Indexset'中的'productcode',方法是检查'usedate'是否在'validto'和'validfrom'日期之间,然后匹配名称.
我已经尝试了各种各样的方法围绕'merge'函数,但无法弄清楚如何让大于和小于运算符的语法.
还试过设置和滚动连接但努力使它们工作.
目前从excel迁移,这只是一个数组中的多标准索引匹配,但不知道如何将它放在R中.
要清楚,我没有遇到错误,只是将语法放在一起完全丢失了.
一旦我有'产品代码',我想我可以处理合并,但绝对难倒在这里!
非常感谢任何人都可以提供帮助!
您可以尝试使用non-equi当前开发版本data.tablev1.9.7中的连接功能.请阅读此处的安装说明.
Useset[Indexset, on = .(username, usedate >= validfrom, usedate <= validto), # which rows?
productcode := productcode][] # what to do?
# usedate username productcode
# 1: 2015-08-01 Smith 1
# 2: 2015-08-04 Richardson 4
# 3: 2015-08-02 Cole 2
# 4: 2015-08-03 Amos 3
Run Code Online (Sandbox Code Playgroud)
Usenet就地更新.
如果性能不是一个大问题,加入username然后过滤器也应该工作,这不需要开发版本data.table:
Useset[Indexset, on = "username"][usedate >= validfrom & usedate <= validto, .(usedate, username, productcode)]
# usedate username productcode
# 1: 2015-08-01 Smith 1
# 2: 2015-08-02 Cole 2
# 3: 2015-08-03 Amos 3
# 4: 2015-08-04 Richardson 4
Run Code Online (Sandbox Code Playgroud)