【问题标题】:Incorporate a time constraint by matching with data.table通过与 data.table 匹配来合并时间约束
【发布时间】:2015-10-11 21:09:39
【问题描述】:

这个问题是上一个问题的后续问题:Click

本题提供了两个data.frames,由于本题侧重于更具体的部分,所以减少了示例数据。

tc <- textConnection('
ID  Track4  Time    Loc
4   50      40      1   
5   55      50      1   
6   55      60      1   

')

MATCHINGS <- read.table(tc, header=TRUE)

tc <- textConnection('
ID  Track4  Time    Loc
""  50      40      1   
""  55      10      1
""  55      40      1   
""  55      59      1     ')  

INVOLVED <- read.table(tc, header=TRUE)

在上一个问题中找到了解决此问题的方法:目标是通过匹配Track1 和Loc 将MATCHINGS 中最近的ID 放入INVOLVED。一个额外的条件是匹配的INVOLVED 条目的Time 不能高于MATCHING 中的条目的Time。这是通过当前方法实现的(见下文)

一个新的约束是:INVOLVED 条目的 Time 不能比 MATCHINGS 条目低 30 秒(Time 列以秒为单位)。现在实现了以下输出:

ID Track4 Time Loc
4     50   40   1
5     55   10   1
5     55   40   1
6     55   59   1

然而,预期的结果是:

ID Track4 Time Loc
4     50   40   1
""    55   10   1
5     55   40   1
6     55   59   1

由于 INVOLVED 条目的时间比匹配 Track4 和 Loc 的 MATCHINGS 条目低 30 秒以上。我不知道如何将其合并到我当前的解决方案中。根据 Matthew Dowle 的说法,de data.table 包中的功能请求与此问题有关,但应该已经可以合并。有人知道怎么做吗?

目前的方法(不考虑时间限制)

M = as.data.table(MATCHINGS)
I = as.data.table(INVOLVED)
M[,Time:=-Time]
I[,Time:=-Time]
setkey(M,Loc,Track4,Time)
I[,ID:={i=list(Loc,Track4,Time);M[i,ID,roll=TRUE,mult="first"]}][,Time:=-Time]  

【问题讨论】:

  • 不,不能超过 30 秒。因此INVOLVED 和MATCHINGS 条目的Time 之间的差异可能不会超过30 秒(所以30 秒或更短)+ INVOLVED 条目的Time 可能不会高于Time MATCHINGS 条目。最后一点已经合并了。
  • 更新了答案以突出显示有限回滚/转发功能(很久以前实现)以及 on= 参数(在 v1.9.6 中实现)。如果它解决了您的问题,请查看并接受,以便 Q 保持回答。谢谢。

标签: r data.table


【解决方案1】:

更新: data.table 中的 roll 参数接受有限的回滚和前滚,因为 A很久。只是更新这篇文章,以便我们可以关闭#615。

# dt1 = MATCHES, dt2 = INVOLVED
# make sure dt2 doesn't have `ID` column, or if it has, it is of integer type
require(data.table) # v1.9.6+
dt2[dt1, ID := i.ID, on=c("Track4", "Time"), roll=30]
#    Track4 Time Loc ID
# 1:     50   40   1  4
# 2:     55   10   1 NA
# 3:     55   40   1  5
# 4:     55   59   1  6

还使用在v1.9.6 中实现的on= 参数。

如有必要,请参阅历史记录以获取旧答案。

【讨论】:

  • +1 很好的解决方案。最好的地方是在 C 的深处,真的不是。由于这在不同的线程中出现了很多,我一直在空闲时间研究它。 roll 可以取 +30(前滚)和 -30(后滚),rolltolast TRUE/FALSE 和以前一样,新的 rollfirstback 也 TRUE/FALSE。当前的 roll=TRUE 对应于 roll=+Inf,但 TRUE 仍可用于向后兼容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多