2014-03-02 65 views
5

我很高興地發現data.table有新版本Ĵ(),並得到了一個問題,關於Ĵ()有關新功能的data.table 1.9.2

X [J(2) ,a],其中「a」是關鍵列,在'j',#2693和常見問題解答2.8中看到'a'。另外,x [J(2)]使用'x'的鍵列自動命名'i'中的列。在'x'和'i'的關鍵字欄相同的情況下,我的欄可以使用'i.name'來引用;例如x [J(2),i.a]`

在S.O中有幾個關於J()的問題,以及data.table有關J()的二進制搜索的介紹。但是我對J()的理解還不是很清楚。

我所知道的是,如果我要選擇行,其中「B」在列A和「d」在列B:

DT2 <- data.table(A= letters[1:5], B=letters[3:7], C=1:5) 
setkey(DT2,A,B) 
DT2[J("b","d")] 

,如果我要選擇行,其中A =「一個「或」c「,我這樣的代碼

DT2[A=="a"|A=="c"] 

很像data.frame的方式。 (小問題:如何選擇使用更多的data.table方式?)

所以據我瞭解,J()只用於上述情況。從2個不同的列中選擇兩個單一值。

希望我的理解是錯誤的。關於J()的文檔很少。我讀了How is J() function implemented in data.table?J(.) is detected and simply replaced with list(.)

似乎每個個案名單()可以代替Ĵ(。)

,並回到剛纔的問題,這個新功能的目的是什麼? x[J(2), a]

真的很感激,如果你能給一些詳細的解釋!

+6

這些應該可能是單獨的問題。 – Thomas

+0

@Thomas感謝您的建議,現在我把它們放在單獨的問題中! – Bigchao

+1

@Arun,當然,我更新了問題,並將'DT [,sum(A,na.rm = FALSE),by = B]'的預期結果。另外,我把問題放在不同的帖子中,並修改了標題。非常感謝! – Bigchao

回答

6

.()J()function包裹的data.tablei參數簡單地通過list()因爲[.data.table不上的ij參數的語言編程的優化事情是如何在內部完成更換。它可以被認爲是一個別名list

他們被包括的原因是爲了節省時間和精力(3個關鍵招!)

如果我想從一個關鍵的第一列選擇鍵值'a''c'我可以做

DT[.(c('a','c'))] 
# or 
DT[J(c('a','c'))] 
# or 
DT[list(c('a','c'))] 

如果我想A='a' or 'c'B = 'd'然後我就可以使用

DT[.(c('a','c'),'d')] 

如果我想A = 'a' or 'c' and B = 'd' or 'e'那麼我會用CJ(或expand.grid)創建所有組合

DT[CJ(c('a','c'),c('d','e'))] 

幫助JSJCJ寫得很好!