ひろがりモンステラ

家のモンステラが凄いことになってる社内SEの雑記ブログです。

R データフレームをsubsetを用いてベクトルで絞り込む

やりたいこと

データフレームについて、ある特定の列について、複数の値のいずれかに一致するという条件で行の絞り込みを行ないたい。例えば、下記のようなデータフレームがあったとき、appleとorangeの行のみを抽出したい。

> #テストデータ
> dat <- data.frame(
            item = c("apple", "orange", "apple", "orange", "grape", "grape", "apple"),
            locate = c("Osaka", "Osaka", "Kyoto", "Tokyo", "Tokyo", "Kyoto", "Tokyo"),
            price = c(100, 200, 120, 180, 200, 210, 140))

> #出力
> dat
    item locate price
1  apple  Osaka   100
2 orange  Osaka   200
3  apple  Kyoto   120
4 orange  Tokyo   180
5  grape  Tokyo   200
6  grape  Kyoto   210
7  apple  Tokyo   140

下記のとおり、細々とOR条件を用いてsubsetを使う方法があるが、これだと要素が増えたときや、要素が可変となる時に対応が面倒。

dat_result <- subset(dat, dat$item=="orange" | dat$item=="apple")

> dat_result
    item locate price
1  apple  Osaka   100
2 orange  Osaka   200
3  apple  Kyoto   120
4 orange  Tokyo   180
7  apple  Tokyo   140
対応

ベクトルで絞り込むのがベスト。この場合、== でなく、%in% を使う。
※==の場合、ベクトルの最初の要素でしか絞り込まれないので注意。

items <- c("orange", "apple")

dat_result <- subset(dat, dat$item %in% items)

> dat_result
    item locate price
1  apple  Osaka   100
2 orange  Osaka   200
3  apple  Kyoto   120
4 orange  Tokyo   180
7  apple  Tokyo   140