2017-10-11 6 views
1

複数の変数の組み合わせに応じてフィルタリングする方法があるかどうか尋ねます。2つの変数を使用してdata.tableをフィルタリングする、エレガントで高速な方法

library(dplyr) 
library(plyr) 
library(data.table) 

data <- iris %>% cbind(group = rep(c("a", "b", "c"), nrow(iris))) %>% as.data.table() 

    Sepal.Length Sepal.Width Petal.Length Petal.Width Species group 
1:   5.1   3.5   1.4   0.2 setosa  a 
2:   4.9   3.0   1.4   0.2 setosa  b 
3:   4.7   3.2   1.3   0.2 setosa  c 
4:   4.6   3.1   1.5   0.2 setosa  a 
5:   5.0   3.6   1.4   0.2 setosa  b 
6:   5.4   3.9   1.7   0.4 setosa  c 

と私はそのようにすることを行うことができ

filter <- data.table(Species = c("setosa", "versicolor", 'setosa'), group = c('a', "b", 'c')) 
     Species group  filter1 
1:  setosa  a  setosa a 
2: versicolor  b versicolor b 
3:  setosa  c  setosa c 

次のDataTableに基づいてそれらをフィルタリングする:具体的には

data[paste(Species, group) %in% filter[, filter1 := paste(Species, group)]$filter1] 

私はしたいと思いますががあるかどうかを知るより効率的に/より速く/簡単に行う方法: おそらく:

この場合、
data[.(Species, group) %in% filter] # does not work 
+1

@Jaapリンクは 'on =。(x = x、y!= y)'のようなより複雑なフィルタリング操作のためだと思います。ここで、おそらく 'data [filter、on = names(filter)、nomatch = 0]'はおそらくターゲットであると思うし、おそらくhttps://stackoverflow.com/questions/18969420/perform-a-semi-join-with-データテーブル – Frank

+0

はい、実際に@フランクは私の質問に答えると同時に私が探していたものに答える。私が述べているように、私はよりエレガントで簡単な方法でそれを探していたので。フランクの答えは十分です。答えとして書いておけば、それを受け入れることができます。 –

答えて

3

、あなたが同様のフィルタリングを参照してください Perform a semi-join with data.table

data[filter, on=names(filter), nomatch=0] 

を行うことができます結合します。

関連する問題