我正在尝试连接两个数据框,这些数据框在SQL中将使用where和a语句来表示日期。
在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
任何帮助和指示都会很棒。
答案 0 :(得分:3)
根据@ zx8754的建议,我尝试使用data.table::foverlaps()
在“数据”中,将“日期”字段重命名为DateStart,并创建第二个日期字段,其中DateEnd = Date。添加以下代码:
while (clock <= start + 58) {
...
Sleep(2000); }
这给了我我想要的东西。
Finding Overlaps between interval sets / Efficient Overlap Joins
答案 1 :(得分:0)
只需merge ID上的两个数据集,然后有条件地过滤后面的行,这些行对应于SQL的JOIN
和WHERE
子句。最后,运行计算并在之后选择列。
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')]