2012-03-09 9 views
4

私は、いくつかの列にわたって複数の基準に従ってデータフレームをサブセット化しています。私は、3つの異なる列のいずれかのベクトル "criteria"で定義されたいくつかの値のいずれかを含むデータフレームの行を選択しています。Rのサブセット複数の列 - より洗練されたコード?

私は動作するコードをいくつか持っていますが、これを行うための他の(よりエレガントな)方法が何か不思議です。ここに私がしたことがあります:

criteria <-c(1:10) 
subset1 <-subset(data, data[, "Col1"] %in% criteria | data[, "Col2"] 
%in% criteria | data[, "Col3"] %in% criteria) 

提案は暖かく歓迎されています。 (私はRの初心者ですので、あなたが示唆されているかについて、非常に簡単な説明がまた暖かく歓迎されています。)

答えて

13

:あなたは列の多くを行うにしたい場合を除き

# Data 
df=data.frame(x=1:4,Col1=c(11,12,3,13),Col2=c(9,12,10,13),Col3=c(9,13,42,23)) 
criteria=1:10 

# Solution 
df[apply(df [c('Col1','Col2','Col3')],1,function(x) any(x %in% criteria)),] 

を、言うことをおそらくより読みやすいです:

subset(df, Col1 %in% criteria | Col2 %in% criteria | Col3 %in% criteria) 
+0

'subset'のマニュアルページは、標準的ではない評価を使用しているので、プログラマチックに注意することに注意してください。 – richiemorrisroe

+1

ヘルプページでその注意を読んでいますが、意味がわかりません。なぜ「非標準的な評価」が問題になるのでしょうか?私のケースでは、私はちょうどいくつかの記述統計を作成するためにデータを分割しているので、私は "サブセット"が私のために問題を引き起こすとは思わない...しかし、それはどのような場合に問題を引き起こすだろうか?ありがとう。 – user1257313

6

私は例としてDFではなくdataを使用しています。

を、それが基準のいずれかを含んでいる場合、指定した列の行列を作成し、そのマトリックステストの各要素のために:これが何をしているかの内訳については

DF[apply(apply(as.matrix(DF[c("Col1","Col2","Col3")]), 
       c(1,2), `%in%`, criteria), 
     1, any),] 

。次に、その行列の各行について、いずれかの行要素がTRUEかどうかを確認します。その場合は、元のデータセットの対応する行を保持します。ダミーデータと

スタート:例を通して作業する

DF <- data.frame(Col1=seq(1, by=2, length=10), 
       Col2=seq(3, by=3, length=10), 
       Col3=seq(7, by=1, length=10), 
       other=LETTERS[1:10]) 

> DF 
    Col1 Col2 Col3 other 
1  1 3 7  A 
2  3 6 8  B 
3  5 9 9  C 
4  7 12 10  D 
5  9 15 11  E 
6 11 18 12  F 
7 13 21 13  G 
8 15 24 14  H 
9 17 27 15  I 
10 19 30 16  J 

のように見えたが、関心のちょうど列を引き出します。

> as.matrix(DF[c("Col1","Col2","Col3")]) 
     Col1 Col2 Col3 
[1,] 1 3 7 
[2,] 3 6 8 
[3,] 5 9 9 
[4,] 7 12 10 
[5,] 9 15 11 
[6,] 11 18 12 
[7,] 13 21 13 
[8,] 15 24 14 
[9,] 17 27 15 
[10,] 19 30 16 

空行の値のいずれかがインデックスに元のデータフレームその

> apply(apply(as.matrix(DF[c("Col1","Col2","Col3")]), c(1,2), `%in%`, criteria), 1, any) 
[1] TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE 

使用TRUEであれば基準

> apply(as.matrix(DF[c("Col1","Col2","Col3")]), c(1,2), `%in%`, criteria) 
     Col1 Col2 Col3 
[1,] TRUE TRUE TRUE 
[2,] TRUE TRUE TRUE 
[3,] TRUE TRUE TRUE 
[4,] TRUE FALSE TRUE 
[5,] TRUE FALSE FALSE 
[6,] FALSE FALSE FALSE 
[7,] FALSE FALSE FALSE 
[8,] FALSE FALSE FALSE 
[9,] FALSE FALSE FALSE 
[10,] FALSE FALSE FALSE 

テストに対する各エントリー。

私はここ2つの applyの呼び出しが必要な場合はわからない
> DF[apply(apply(as.matrix(DF[c("Col1","Col2","Col3")]), c(1,2), `%in%`, criteria), 1, any),] 
    Col1 Col2 Col3 other 
1 1 3 7  A 
2 3 6 8  B 
3 5 9 9  C 
4 7 12 10  D 
5 9 15 11  E 
関連する問題