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