当日期在其他两个日期之间时,如何将数据集连接到另一个 R
Posted
技术标签:
【中文标题】当日期在其他两个日期之间时,如何将数据集连接到另一个 R【英文标题】:How can I connect a data set to another when the date is between 2 other dates R 【发布时间】:2017-11-10 10:05:27 【问题描述】:我需要合并两个数据集,但如果一个数据集的日期介于另一个数据集的两个日期之间,则必须合并行。第一个数据集data
如下所示:
Date Weight diff Loc.nr
2013-01-24 1040 7 2
2013-01-31 1000 7 2
2013-02-07 1185 7 2
2013-02-14 915 7 2
2013-02-21 1090 7 2
2013-03-01 1065 9 2
2013-01-19 500 4 9
2013-01-23 1040 3 9
2013-01-28 415 5 9
2013-01-31 650 3 9
2013-02-04 725 4 9
2013-02-07 450 3 9
2013-02-11 550 4 9
另一个数据集matches
如下所示:
Date winning
2013-01-20 1
2013-01-27 0
2013-02-03 1
2013-02-10 0
2013-02-17 1
2013-02-24 0
我写了一段代码,将matches
的获胜列连接到数据集“数据”:
data$winning <- NA
for(i in 1:nrow(data))
for(j in 1:nrow(matches))
if((data$Date[i]-data$diff[i]) < matches$Date[j] & data$Date[i] > matches$Date[j])
data$winning[i] <- matches$winning[j]
这段代码需要 3 天才能运行,有更快的方法吗?
我的预期输出是:
Date Weight diff Loc.nr winning
2013-01-24 1040 7 2 1
2013-01-31 1000 7 2 0
2013-02-07 1185 7 2 1
2013-02-14 915 7 2 0
2013-02-21 1090 7 2 1
2013-03-01 1065 9 2 0
2013-01-19 500 4 9 NA
2013-01-23 1040 3 9 NA
2013-01-28 415 5 9 0
2013-01-31 650 3 9 NA
2013-02-04 725 4 9 1
2013-02-07 450 3 9 NA
2013-02-11 550 4 9 0
【问题讨论】:
你能解释一下为什么2016-07-01
有winning=1
吗?我不明白什么时候匹配的条件。
在data.table
中查找“non-equi joins”。
【参考方案1】:
按照Gregor 的建议,non-equi join 你可以尝试一下
library(data.table)
setDT(data)[, winning := setDT(matches)[data[, .(upper = Date, lower = Date - diff)],
on = .(Date < upper, Date > lower)]$winning][]
Date Weight diff Loc.nr winning 1: 2013-01-24 1040 7 2 1 2: 2013-01-31 1000 7 2 0 3: 2013-02-07 1185 7 2 1 4: 2013-02-14 915 7 2 0 5: 2013-02-21 1090 7 2 1 6: 2013-03-01 1065 9 2 0 7: 2013-01-19 500 4 9 NA 8: 2013-01-23 1040 3 9 NA 9: 2013-01-28 415 5 9 0 10: 2013-01-31 650 3 9 NA 11: 2013-02-04 725 4 9 1 12: 2013-02-07 450 3 9 NA 13: 2013-02-11 550 4 9 0
【讨论】:
这个应该可以工作,但我收到你的错误: vecseq 错误(f__, len__, if (allow.cartesian || notjoin || !anyDuplicated(f__, : Join results in 231055 rows; more比 197486 = nrow(x)+nrow(i)。检查 i 中的重复键值,每个键值都一遍又一遍地加入 x 中的同一组。如果没关系,请尝试 by=.EACHI 为每个组运行 j以避免大分配。如果您确定要继续,请重新运行 allow.cartesian=TRUE。否则,请在 FAQ、Wiki、Stack Overflow 和 datatable-help 中搜索此错误消息以获取建议。您知道如何解决这个问题? 显然,matches
中有不止一个游戏匹配data
中的一行。 (样本数据集未涵盖的另一种情况)。暂时请尝试添加allow = TRUE
,即setDT(data)[, winning := setDT(matches)[data[, .(upper = Date, lower = Date - diff)], on = .(Date < upper, Date > lower), allow = TRUE]$winning][]
,看看是否可行。
我注意到Date
包含两个序列。也许,分组时需要一个隐藏参数?以上是关于当日期在其他两个日期之间时,如何将数据集连接到另一个 R的主要内容,如果未能解决你的问题,请参考以下文章
如何重写我的 swift 代码,以便它还考虑计算两个日期之间的差异,当一个日期在未来时?
当每周按一次按钮从另一张表导入日期时,如何在列中自动填充日期?
如何查看一个日期是不是在其他两个日期之间,以及使用的时间和剩余的时间?