1. ホーム
  2. r

[解決済み] ベクトル内の値に基づいてデータフレームから行を選択する

2023-04-14 11:46:45

質問

このようなデータを持っています。

dt <- structure(list(fct = structure(c(1L, 2L, 3L, 4L, 3L, 4L, 1L, 2L, 3L, 1L, 2L, 3L, 2L, 3L, 4L), .Label = c("a", "b", "c", "d"), class = "factor"), X = c(2L, 4L, 3L, 2L, 5L, 4L, 7L, 2L, 9L, 1L, 4L, 2L, 5L, 4L, 2L)), .Names = c("fct", "X"), class = "data.frame", row.names = c(NA, -15L))

の値に基づいて、このデータフレームから行を選択したいのです。 fct 変数の値に基づいて選択したいのです。例えば、もし私が "a" または "c" のいずれかを含む行を選択したい場合、次のようにすることができます。

dt[dt$fct == 'a' | dt$fct == 'c', ]

となり

1    a 2
3    c 3
5    c 5
7    a 7
9    c 9
10   a 1
12   c 2
14   c 4

は予想通りです。しかし、私の実際のデータはもっと複雑で、実際には次のようなベクトルの値に基づいて行を選択したいのです。

vc <- c('a', 'c')

ということで、試しに

dt[dt$fct == vc, ]

が、もちろんそれはうまくいきません。ベクトルをループして必要な行を取り出し、新しいデータフレームに追加するコードを書くことができることは知っていますが、もっとエレガントな方法があることを期待していました。

では、ベクターの内容に基づいてデータをフィルタリング/サブセットするにはどうすればよいのでしょうか。 vc ?

どのように解決するのですか?

をご覧ください。 ?"%in%" .

dt[dt$fct %in% vc,]
   fct X
1    a 2
3    c 3
5    c 5
7    a 7
9    c 9
10   a 1
12   c 2
14   c 4

また ?is.element :

dt[is.element(dt$fct, vc),]