3

私の前の質問のひどい実行と解釈なので、最初からやり直して、可能な限り短く一般的な質問を定式化しようとします。

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 を配置することです。追加の条件は、一致するエントリの がのエントリのよりも高くないことです。さらに、一致は最も優先され、一致は最も優先されません。ただし、 のみが常に使用可能です (他のすべての列は空にすることができます)。したがって、期待される結果は次のとおりです。INVOLVEDTrack1Track4LocTimeINVOLVEDTimeMATCHINGTrack1Track4Track4Track

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、そのIDyを割り当てる必要がありますINVOLVED row。つまり、マッチTrack3オーバーライドマッチTrack4Track2マッチ オーバーライドTrack3マッチ、Track1マッチ オーバーライドTrack2マッチです。

4

1 に答える 1

5

v1.9.6+roll引数は、新しい( )引数とともに次の観測を逆方向にロールすることもon=できるため、これをはるかに簡単に行うことができます。

require(data.table)
setDT(MATCHINGS)
setDT(INVOLVED)
INVOLVED[ , ID := MATCHINGS[INVOLVED, ID, roll=-Inf, 
                    mult="first", on=c("Loc", "Track4", "Time")]]]

それでおしまい。


これがdata.table-ishスタートです。これはトラック4(1から3ではない)のみを使用しますが、それでも要求された出力を生成しているように見えます。

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]

    ID Track1 Track2 Track3 Track4 Time Loc
 1:  1     NA    105     NA     35    1   1
 2:  1     NA     NA     NA     35    2   1
 3:  1     26    105     NA     35    3   1
 4:  2     NA     NA     NA     40   20   1
 5:  2    134      1      6     40   20   1
 6:  3     13    109     NA     45   30   1
 7:  4     15     NA     NA     50   40   1
 8:  5     17     NA    109     55   50   1
 9: NA     17    432    109     55   65   1
10:  6     17    115    109     55   59   1
11:  7     13    195    150     60   68   1
12:  7     13    195    150     60   62   1
13: NA     10      5      1     10   61   3
14:  8     13    195    150     60   72   1

面白い質問です!これで問題ないと思われる場合は、サンプルデータを変更してトラック1から3が必要になるようにしてください。または、ここから取得することもできます。

于 2012-10-04T11:29:32.687 に答える