私の前の質問のひどい実行と解釈なので、最初からやり直して、可能な限り短く一般的な質問を定式化しようとします。
2 つのデータフレームがあります (以下の例を参照)。各データセットには、同じ数の列が含まれています。
tc <- textConnection('
ID Track1 Track2 Track3 Track4 Time Loc
4 15 "" "" 50 40 1
5 17 115 109 55 50 1
6 17 115 109 55 60 1
7 13 195 150 60 70 1
8 13 195 150 60 80 1
9 "" "" 181 70 90 2 #From this row, example data added
10 "" "" 182 70 92 2
11 429 31 "" 80 95 3
12 480 31 12 80 96 3
13 118 "" "" 90 100 4
14 120 16 213 90 101 4
')
MATCHINGS <- read.table(tc, header=TRUE)
tc <- textConnection('
ID Track1 Track2 Track3 Track4 Time Loc
"" 15 "" "" 50 40 1
"" 17 "" 109 55 50 1
"" 17 432 109 55 65 1
"" 17 115 109 55 59 1
"" 13 195 150 60 68 1
"" 13 195 150 60 62 1
"" 10 5 1 10 61 3
"" 13 195 150 60 72 1
"" 40 "" 181 70 82 2 #From this row, example data added
"" "" "" 182 70 85 2
"" 429 "" "" 80 90 3
"" "" 31 12 80 92 3
"" "" "" "" 90 95 4
"" 118 16 213 90 96 4
')
INVOLVED <- read.table(tc, header=TRUE)
目標は、 toとを照合することにより、MATCHINGS
からの最も古い ID を配置することです。追加の条件は、一致するエントリの がのエントリのよりも高くないことです。さらに、一致は最も優先され、一致は最も優先されません。ただし、 のみが常に使用可能です (他のすべての列は空にすることができます)。したがって、期待される結果は次のとおりです。INVOLVED
Track1
Track4
Loc
Time
INVOLVED
Time
MATCHING
Track1
Track4
Track4
Track
ID Track1 Track2 Track3 Track4 Time Loc
4 15 "" "" 50 40 1
5 17 "" 109 55 50 1
"" 17 432 109 55 65 1
6 17 115 109 55 59 1
7 13 195 150 60 68 1
7 13 195 150 60 62 1
"" 10 5 1 10 61 3
8 13 195 150 60 72 1
9 40 "" 181 70 82 2 #From this row, example data added
10 "" "" 182 70 85 2
11 429 "" "" 80 90 3
12 "" 31 12 80 92 3
13 "" "" "" 90 95 4
13 118 16 213 90 96 4
data.table
パッケージでこれを試みましたが、これを効率的に行うことができませんでした。ベクタースキャンを取り除き、ループせずにデータを効率的に処理することは可能ですか?
dat <- data.table(MATCHINGS)
for(i in 1:nrow(INVOLVED)){
row <- INVOLVED[i,]
match <- dat[Time>=row$Time][Loc==row$Loc][Track4==row$Track4][Track4!=""][order(Time)][1]
if(!is.na(match$ID)){ INVOLVED$ID[i]<-match$ID }
match <- dat[Time>=row$Time][Loc==row$Loc][Track3==row$Track3][Track3!=""][order(Time)][1]
if(!is.na(match$ID)){ INVOLVED$ID[i]<-match$ID }
match <- dat[Time>=row$Time][Loc==row$Loc][Track2==row$Track2][Track2!=""][order(Time)][1]
if(!is.na(match$ID)){ INVOLVED$ID[i]<-match$ID }
match <- dat[Time>=row$Time][Loc==row$Loc][Track1==row$Track1][Track1!=""][order(Time)][1]
if(!is.na(match$ID)){ INVOLVED$ID[i]<-match$ID }
}
アップデート
の必要性を示すサンプル データを更新しましたTrack 1 to 3
。示されているようTrack1
に、最も重要であり、最も重要ではありTrack4
ません。Track1 to 3
に一致しMATCHINGS x
、にTrack4
一致する場合でもMATCHINGS y
、そのID
にy
を割り当てる必要がありますINVOLVED row
。つまり、マッチTrack3
オーバーライドマッチTrack4
、Track2
マッチ オーバーライドTrack3
マッチ、Track1
マッチ オーバーライドTrack2
マッチです。