データフレームのフィルタリング


12

Rの基本機能をまだ学習していますが、サブセット機能は、複数の条件の有無にかかわらず、単一の列に基づいた条件のみに基づいてフィルター処理するように見えますか?

データフレームからデータを簡単にフィルタリングするにはどうすればよいですか?

  1. 複数の条件が提供されている場合

  2. 使用可能な列全体に条件を適用する必要がある場合。

例:次を含むデータフレームが与えられた場合

name    D1      D2     D3      D4
julius  "A"     "A"    "B"     "B"
cate    "D"     "E"     "A"     "C"
karo    "A"     "D"     "C"     "E"

このデータフレームをフィルター処理して、D1からD4のいずれかが「E」である名前だけが必要になるようにします。

name    D1      D2     D3      D4
cate    "D"     "E"     "A"     "C"
karo    "A"     "D"     "C"     "E"

D1が列の大きなリストになる可能性があるとしましょう。このフィルターを実行するための推奨されるアプローチはどのようなものですか?ありがとうございました

回答:


26

サブセット関数で複数のフィルターを組み合わせたい場合は、論理演算子を使用します。

 subset(data, D1 == "E" | D2 == "E")

列D1または列D2のいずれかの値が「E」である行を選択します。利用可能な論理演算子については、ヘルプページをご覧ください。

 > ?"|"

2番目の質問で必要なのは、行をフィルタリングすることです。これは次の方法で実現できます

 collist <- c("D1","D2","D3","D4")
 sel <- apply(data[,collist],1,function(row) "E" %in% row)
 data[sel,]

適用する最初の引数は、フィルタリングする必要がある列を提供します。2番目の引数は1です。これは、データの行をループしていることを意味します。3番目の引数は名前のない1行関数で、行に「E」が存在する場合にTRUEを返し、「E」が存在しない場合にFALSEを返します。

適用関数の結果は、データ内の行数と同じ長さの論理ベクトルselになります。次に、このベクトルを使用して必要な行を選択します。

更新

同じことがgrepで実現できます。

sel <- apply(data[,collist],1,function(row) length(grep("E",row))>0)

Rのデフォルト引数を指定したgrepは、指定されたベクトル内で一致するパターンを持つ要素の数を返します。


2
別の便利な機能はanyです。たとえば、ベクトルの少なくとも1つの要素が存在することを確認する= 10場合は、(any(v==10))と記述できます。
ニコ

@nicoええ、しかし10%in%vには9文字があり 10の変種があります :) 数値ベクトルの場合、等式を使用することをお勧めしますが、Rはスマートであり、データが実数と混合した整数である場合、データセットに10があることを正しく認識します。
mpiktas

正規表現の場合はどうですか?完全一致で作業したくないと仮定しますか?他の言語のように〜=に近いものがありますか?Rのその表現に最も近いもの
eastafri

参照@Biorelated grepおよびagrepPOSIX 1003.2またはPerl互換の正規表現上、および関連ドキュメントを。
chl

@ Biorelated、grepの例を使用して回答を更新しました。
mpiktas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.