2016-10-11 6 views
3

私は下表dtで始まり、リストkeysによって、その列のサブセットをしようとしています:サブセットdata.table列独立

library(data.table) 

set.seed(123) 

randomchar <- function(n, w){ 
    chararray <- replicate(w, sample(c(letters, LETTERS), n, replace = TRUE)) 
    apply(chararray, 1, paste0, collapse = "") 
} 

dt <- data.table(x = randomchar(1000, 3), 
       y = randomchar(1000, 3), 
       z = randomchar(1000, 3), 
       key = c("x", "y", "z")) 

keys <- with(dt, list(x = sample(x, 501), 
       y = sample(y, 500), 
       z = sample(z, 721))) 

私はループを使って、私が望む結果を得ることができます。

desired <- copy(dt) 

for(i in seq_along(keys)){ 
    keyname <- names(keys)[i] 
    desired <- desired[get(keyname) %in% keys[[i]]] 
} 

desired 

質問があります - このサブセットを行うためにもっとデータテーブルが慣れ親しんでいますか?

CJdt[CJ(keys)]を試しましたが、非常に時間がかかります。

+0

それは何の 'paste'とフィルタですべての3つのキーを連結し、新たなフィールド' key'を作成する方法について? –

+0

'do.call(CJ、keys)'を使うことを意味すると思います。 – Frank

+0

@Frankおそらく - 私はそれを試して完了しましたが、どちらも長くかかり、望みの結果が得られません。 –

答えて

4

何マスクを構築し、このマスクにdtをフィルタリングについて:

dt[Reduce(`&`, Map(function(key, col) col %in% key, keys, dt)),] 
+0

この実装は、私の –

+0

の約2倍の速度ですが、ここではフィルタリングに時間がかかります。 –

関連する問題