此问题是对上一个问题的跟进: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)
在上一个问题中,找到了解决此问题的解决方案:目标是通过匹配ID
和{MATCHINGS
将INVOLVED
中的Track1
放入Loc
{1}}。一个额外的条件是匹配的Time
条目的INVOLVED
可能不会高于Time
中条目的MATCHING
。这是通过当前的方法实现的(见下文)
新约束是:Time
条目的INVOLVED
可能不超过30秒(Time
列以秒为单位)低于MATCHINGS
条目。现在实现了以下输出:
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
条目的时间比MATCHINGS
和Track4
上匹配的Loc
条目低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]
答案 0 :(得分:1)
更新: roll
参数接受有限回滚和前滚很久以来。只需更新此帖子,即可关闭#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
还使用on=
中实现的v1.9.6
参数。
如有必要,请查看旧答案的历史记录。