2

この質問は前の質問のフォローアップです:クリック

この質問では、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]  
4

1 に答える 1

1

更新: data.tablerollの引数は、A LONG TIME 以来、有限のロール バックロール フォワードを受け入れます。#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

必要に応じて、古い回答の履歴を参照してください。

于 2013-01-24T13:05:52.410 に答える