2013-02-24 65 views
6

我的問題涉及R data.table與多個鍵。藉此例如:加入並加入data.table的組合?

library(data.table) 
example(data.table) 
key(DT) 
[1] "x" "y" 

和假設我要的變化「×不等於B和Y不等於3」,如在這裏:

DT[!J("b",3)] 
    x y v v2 m 
1: a 1 42 NA 42 
2: a 3 42 NA 42 
3: a 6 42 NA 42 
4: b 1 4 84 5 
5: b 6 6 84 5 
6: c 1 7 NA 8 
7: c 3 8 NA 8 
8: c 6 9 NA 8 

我想的變化是「X以下b和y不等於3「,如下所示:

DT[J("b",!3)] 
Error in `[.data.table`(DT, J("b", !3)) : 
    typeof x.y (double) != typeof i.V2 (logical) 

有沒有告訴J()否定某些鍵的機會? 謝謝!

+1

我覺得後續的語法有點更加透明:'DT [X ==「B」& y!= 3]' – 2013-02-24 19:04:40

+2

嗨@GaryWeissman,你的語法意味着一個向量掃描。 data.table和join操作的關鍵是通過使用鍵來避免這些操作。但我想你是對的,對於非data.table用戶更容易理解。 – 2013-02-24 19:13:59

+0

我不認爲'J'函數支持參數之間的非一致邏輯運算符。我相信上述語法在DT中比在DF中更快。 – 2013-02-24 19:15:11

回答

6

對於複合鍵您可以使用以下

DT[.("b")][!.(x, 3)] # x is the name of first column of key 

在一般情況下,你可以鏈在一起的幾個[ ] [ ]向下篩選到你需要的結果。



請注意,您也可以輕鬆使用的data.tablei邏輯語句。
J() - 或現在的.() - 語法,只是一個簡短的方便。

您幾乎可以使用任何會嵌入if子句中的內容,並且可以將列名作爲變量訪問。

在你的具體的例子,你可以使用x=="b" & y != 3 注單&,不&&

DT[ x=="b" & y != 3] 

您也可以使用二進制搜索的data.table組合矢量掃描如下

DT[.("b")][y != 3] 
+0

賓果!萬分感謝! – 2013-02-24 20:24:15