【问题标题】:Join two data frames SQL where and between overlaps [duplicate]在重叠的地方和之间加入两个数据框SQL [重复]
【发布时间】:2016-02-07 18:46:34
【问题描述】:

我正在尝试连接两个数据框,这两个数据框在 SQL 中会使用 where 和 between 语句来表示日期。

在 SQL 中,代码为:

select Date,(Value1-Test1) as Ans1,(Value2-Test2) as Ans2,ID
from Data a
 inner join Test b on a.ID=b.ID and a.Date between b.DateStart and c.DateEnd 

这是数据

Date                Value1  Value2  ID
01/01/16 19:30:00       10      30  A
01/01/16 19:50:20       20      40  B
01/01/16 19:55:30       30      50  C

这是测试

RowNumber   DateStart            DateEnd    Test1   Test2   ID
1   01/01/16 17:00:00   01/01/16 22:00:05   2          4    A
2   01/01/16 22:00:06   01/01/16 01:50:00   3          6    A
3   01/01/16 17:00:00   01/01/16 22:00:05   4          8    B
4   01/01/16 22:00:06   01/01/16 01:50:00   5          2    B
5   01/01/16 17:00:00   01/01/16 22:00:05   6          4    C
6   01/01/16 22:00:06   01/01/16 01:50:00   7          5    C

我正在尝试创建的结果

Date                  Ans1    Ans2 ID
01/01/16 19:30:00        8      26  A
01/01/16 19:50:12       16      32  B
01/01/16 19:55:24       24      46  C

任何帮助和指点都会很棒。

【问题讨论】:

标签: sql r


【解决方案1】:

根据@zx8754 的建议,我尝试使用data.table::foverlaps()

在数据中,将日期字段重命名为 DateStart 并创建第二个日期字段,其中 DateEnd=Date。添加以下代码:

setkey(Data,ID,DateStart,DateEnd) 
setkey(Test,Id,DateStart,DateEnd) 
CompleteDataset <- foverlaps(Data, Test, type="any")

这正是我想要的。

Finding Overlaps between interval sets / Efficient Overlap Joins

【讨论】:

  • 这些文档来自 1.9.4。如果您想要 1.9.7 文档,您可以查看这个非官方镜像:jangorecki.gitlab.io/data.table/html/foverlaps.html
  • 我现在尝试将此代码 CompleteDataset
  • @JakeWilliams,试试which = FALSE(不带引号。which 参数需要逻辑值。“FALSE”是字符类型。)
  • @Arun 我注意到并更改了它,但仍然是相同的错误消息...
  • @JakeWilliams 最好发布一个新问题,在您的 Azure ML 环境中提供 data.table 版本。如果您在 Azure ML 中对已在本地测试过的相同数据进行操作,或者它是新的/更大的数据集,还要写。
【解决方案2】:

只需merge ID 上的两个数据集,然后有条件地过滤对应于 SQL 的 JOINWHERE 子句的行。最后,运行计算并随后选择列。

mergedf <- merge(data, test, by="ID")

mergedf <- mergedf[(mergedf$Date >= mergedf$DateStart & 
                    mergedf$Date <= mergedf$DateEnd),]

mergedf$Ans1 <- mergedf$Value1 - mergedf$Test1
mergedf$Ans2 <- mergedf$Value2 - mergedf$Test2

mergedf <- mergedf[c('Date', 'Ans1', 'Ans2', 'ID')]

【讨论】:

  • 尝试进行第一次合并时,我收到一条错误消息,告诉我由于重复值(我们知道),我有超过 nrow(data)+nrow(test) 并且不允许我来炸掉它
  • 抱歉,R 区分大小写,所以 ID,合并键,应根据您发布的示例大写。
猜你喜欢
  • 1970-01-01
  • 2018-06-11
  • 2015-04-22
  • 1970-01-01
  • 2020-10-27
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
  • 2021-12-18
相关资源
最近更新 更多