2016-05-25 11 views
2
Index odx1 odx2 odx3 odx4 odx5 
1  123  0  0  0  0 
2  0  321  0  0  0 
3  0  0  0  123  0 
4  0  321  0  0  0 
5  0  0  0  0  0 

私は上記のデータセットのサンプルを添付しました。私は私がこれまで試みられてきたことはdplyr使用することである123または321複数の列に適用されたRのフィルタリング/サブセット

例えば含まれているというのが私のデータセットをサブセット化Rに複数のカラムにフィルタリングしたい -

df %>% filter(., odx1==123 | odx2==123 | odx3==123 | odx4==123 | odx5==123 | odx1==321| odx2==321| odx3==321| odx4==321| odx5==321) 

上記は動作しますが、これを行うより簡単な方法がありますか?

私の実際のデータセットにはodx1-odx25が含まれています。私は、約100K行にわたってフィルタリングするために約15文字列のリストを持っています。

EDIT:

実際のデータセットは、数字のランダムな文字列が含まれていますが、私は一例として、視認性と簡単にするために0を使用していました。私のコメントのように

Index odx1 odx2 odx3 odx4 odx5 
1  123  421  532  414  981 
2  243  321  765  132  321 
3  144  322  587  123  444 
4  655  321  459  091  676 
5  456  421  523  431  768 
+5

どうDF [rowSums 'について(== 123 DF | ' –

+1

データが常にこの一般的な形式であれば(ちょうどすべての '0'からなる観測値を取り除きたい場合は、少し速く(キーストロークと計算時間の両方に関して) )は、次のようになります: 'df [rowSums(df!= 0)!= 0、]' –

答えて

3

データは、この一般的な形式で常にある場合(ほんの少し速く、その後、全て0で構成されて観測を取り除きたい(両方のキーストロークの面でと計算時間)ソリューションは、次のようになります。

また
df[rowSums(df[, -1]!=0)!=0,] 
+0

インデックス列を除外する必要があるので、rowSumsのdf [、-1] ユーザシステム経過時間 2.744 0.798 3.894 system.time(df [rowSums(df!= 0)!= 0、]) ユーザシステムが経過しました 5.086 1.617 6.939 ' – Gopala

+0

私の頭の中でindexはrow.names(時には人々が間違ってそれらを含むこともあるので)でしたが、私は上記のコードを実行する前に落としていました。ありがとう –

2

あなたは(あなたが上でフィルタリングする15個の文字列を持っていると述べた)値の明示的なセットにフィルタリングする必要がある場合、あなたはすべての列にわたってフィルタリングするためにこれを使用することができ

library(dplyr) 
conditions.to.match <- c(123, 321) 
df %>% filter(Reduce('|', lapply(df, '%in%', conditions.to.match))) 

Idea from here

1

基本パッケージ:

df[apply(df, 1, function(x) {any(x == 123 | x == 321)}),] 

dplyrパッケージ

library(dplyr) 
filter(df, rowSums(mutate_each(df, funs(. %in% c(123, 321)))) >= 1L) 

出力:

Index odx1 odx2 odx3 odx4 odx5 
1  1 123 0 0 0 0 
2  2 0 321 0 0 0 
3  3 0 0 0 123 0 
4  4 0 321 0 0 0 
関連する問題