【发布时间】: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可能不会高于TimeMATCHINGS条目。最后一点已经合并了。 -
更新了答案以突出显示有限回滚/转发功能(很久以前实现)以及
on=参数(在 v1.9.6 中实现)。如果它解决了您的问题,请查看并接受,以便 Q 保持回答。谢谢。
标签: r data.table