当日期在其他两个日期之间时,如何将数据集连接到另一个 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-01winning=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 &lt; upper, Date &gt; lower), allow = TRUE]$winning][],看看是否可行。 我注意到Date 包含两个序列。也许,分组时需要一个隐藏参数?

以上是关于当日期在其他两个日期之间时,如何将数据集连接到另一个 R的主要内容,如果未能解决你的问题,请参考以下文章

如何重写我的 swift 代码,以便它还考虑计算两个日期之间的差异,当一个日期在未来时?

在两个日期选择器之间过滤数据表

当每周按一次按钮从另一张表导入日期时,如何在列中自动填充日期?

如何查看一个日期是不是在其他两个日期之间,以及使用的时间和剩余的时间?

Pyspark:两个日期之间的差异(Cast TimestampType,Datediff)

检查其他两个日期之间的日期弹簧数据jpa