この質問は前の質問のフォローアップです:クリック
この質問では、2つのdata.frameが提供されています。この質問はより具体的な部分に焦点を当てているため、サンプルデータは削減されています。
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ものをからに配置することです。追加の条件は、一致するエントリのがのエントリのより高くてはならないということです。これは、現在のアプローチで達成されました(以下を参照)MATCHINGSINVOLVEDTrack1LocTimeINVOLVEDTimeMATCHING
新しい制約は次のとおりです。エントリの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するエントリよりも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]