2013-07-15 31 views
-1

我有更大的一組數據,並且需要滿足某些條件的行的行號。行號。打包data.table。列的子集上的data.table「二進制搜索」的行索引

days <- strptime(c("2013-01-01 8:00:00", "2013-02-01 8:00:00"), format="%Y-%m-%d %H:%M:%S") 
DateTime <- rep(seq(days[1], days[2], length.out=1e6/5), 5) 
Update <- rep(LETTERS[3:1], length.out=1e6) 
Group <- rep(c("AAA", "BBB", "CCC"), length.out=1e6) 
Weight <- trunc(rnorm(1e6, 110, 3)) 
Weight2 <- rnorm(1e6, 100, 1.5) 
DT <- data.table(DateTime, Update, Group, Weight, Weight2) 
setkey(DT, DateTime, Update, Group, Weight, Weight2) 

Exp <- DT[1e6/2] 

我不能沒有列的DateTime創建另一個data.table作爲一個子集,因爲此列中的關鍵應用。在子集上創建一個新密鑰可能會改變順序,我需要確定原始順序已被保留。

有可能通過使用兩個命令來得到行號我所需要的。

system.time(DT[, which(DT$Update==Exp$Update & DT$Group==Exp$Group & DT$Weight==Exp$Weight & DT$Weight2==Exp$Weight2)]) 
system.time(which(DT$Update==Exp$Update & DT$Group==Exp$Group & DT$Weight==Exp$Weight & DT$Weight2==Exp$Weight2)) 

不過,我需要一個更快的方法來做到這一點。

謝謝你的任何建議。

+3

請避免說明包裝的一般性。當他們錯了時,他們會讓你的問題變得更長,並且會特別困惑。讓它簡單,**我有這個,我嘗試過,我得到了這個,但我想得到這個**。 – agstudy

+0

我編輯了我的問題。 [鏈接](http://stackoverflow.com/questions/15597685/subsetting-data-table-by-2nd-column-only-of-a-2-column-key-using-binary-search)確實提供了一個答案到一個不同的,但類似的問題。解決方案是不同的。 – camsique

回答

0

有可能通過以下方式獲得行號

which(is.na(DT[list(DT$DateTime, DT$Update, 
DT$Group, DT$Weight, Exp$Weight2), which=TRUE]) == FALSE) 

但是它比問題中的矢量搜索示例慢4倍。