2

这个问题是上一个问题的后续问题:点击

在这个问题中,提供了两个 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的 fromMATCHINGS放入。一个额外的条件是匹配条目的 可能不高于中的条目。这是通过当前方法实现的(见下文)INVOLVEDTrack1LocTimeINVOLVEDTimeMATCHING

一个新的约束是:条目TimeINVOLVED时间不能比条目低超过 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

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

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

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]  
4

1 回答 1

1

Update: roll argument in data.table accepts finite roll backs and roll forwards since A LONG TIME. Just updating this post so that we can close #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

Also using the on= argument implemented in v1.9.6.

See history for the older answer if necessary.

于 2013-01-24T13:05:52.410 回答