web-dev-qa-db-ja.com

ベクトル上のデータフレームのフィルタリング

dfAなどのID列を持つデータフレームBがあります。特定のIDを含むベクターもあります。

L <- c("A", "B", "E")

ベクターに存在するIDのみを取得するようにデータフレームをフィルター処理するにはどうすればよいですか?個人的には、

subset(df, ID == "A")

しかし、どうすればベクトル全体をフィルタリングできますか?

26
adam.888

_%in%_演算子を使用できます。

_> df <- data.frame(id=c(LETTERS, LETTERS), x=1:52)
> L <- c("A","B","E")
> subset(df, id %in% L)
   id  x
1   A  1
2   B  2
5   E  5
27  A 27
28  B 28
31  E 31
_

IDが一意の場合は、match()を使用できます。

_> df <- data.frame(id=c(LETTERS), x=1:26)
> df[match(L, df$id), ]
  id x
1  A 1
2  B 2
5  E 5
_

または、それらをデータフレームの行名にして、行ごとに抽出します。

_> rownames(df) <- df$id
> df[L, ]
  id x
A  A 1
B  B 2
E  E 5
_

最後に、より上級者向けで、速度が問題になる場合は、_data.table_パッケージを調べることをお勧めします。

45
flodel

「マッチ」を使用する必要があると思います。これは、1つのベクトルの値を別のベクトルの値に一致させ、一致しないNAを提供します。したがって、一致の!is.naに基づいてサブセットを作成します。

?matchを参照してください。おそらく自分で解決することができます。その場合、誰かがすぐに行う正確な回答から多くのことを学び、カットアンドペーストを勧めます:)

2
Spacedman