2013-01-24 93 views
2

這個問題納入匹配時間限制是後續到以前的問題:Click與data.table

在這個問題上提供了兩個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) 

在上一問題找到了解決辦法,這一問題:我們的目標是通過匹配上Track1LocMATCHINGS最近最少ID放入INVOLVED。一個額外的條件是匹配INVOLVED條目的Time可能不會高於MATCHING條目的Time。這與當前的方法來實現(見下文)

一個新的約束條件是:所述INVOLVED條目的Time可能不超過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條目的時間比MATCHINGS條目上Track4和匹配低超過30秒Loc。我沒有看到如何將其納入我目前的解決方案。根據Matthew Dowle的說法,data.table包中的功能請求與此問題有關,但它應該已經可以成立。有誰知道如何?

目前的方法(如果不花時間約束考慮在內)

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] 
+1

不,它可能不會超過30秒。因此,「參與」和「匹配」條目的「時間」之間的差異可能不超過30秒(如此30秒或更少),而「參與」條目的「時間」可能不會高於「時間」 「MATCHINGS」條目。這最後一點已經合併。 –

+0

已更新回答,以突出顯示有限回滾/轉發功能(很久以前實現)以及'on ='參數(在v1.9.6中實現)。請檢查並接受它是否解決了您的問題,以便Q保持解答。謝謝。 – Arun

回答

1

更新:rolldata.table參數接受有限卷備份滾動向前很長時間以來。只是更新這篇文章,以便我們可以關閉#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 

而且使用v1.9.6實施on=說法。

如有必要,請查看舊版答案的歷史記錄。

+2

+1偉大的解決方案。最好的地方是在C深處,真的不是這樣。由於這個問題在不同的主題中已經出現很多,所以我一直在空閒時間進行研究。 'roll'可以像以前一樣採用+30(向前滾動)和-30(向後滾動),'rolltolast' TRUE/FALSE,新的'rollfirstback'也是TRUE/FALSE。當前roll = TRUE對應於roll = + Inf,但爲了向後兼容,TRUE仍然可以接受。 –