89

私はこれに似たデータを持っています:

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ですか?

4

3 に答える 3

154

をご覧ください?"%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),]
于 2012-07-23T12:13:50.823 に答える
35

上記と同様に、fromを使用filterdplyrます:

filter(df, fct %in% vc)
于 2017-01-29T11:34:51.877 に答える
15

別のオプションは、キー付きを使用することdata.tableです:

library(data.table)
setDT(dt, key = 'fct')[J(vc)]  # or: setDT(dt, key = 'fct')[.(vc)]

その結果:

   fct X
1:   a 2
2:   a 7
3:   a 1
4:   c 3
5:   c 5
6:   c 9
7:   c 2
8:   c 4

これは何をしますか:

  • setDT(dt, key = 'fct')列をキーとして設定しdata.frameて、をdata.table(の拡張形式であるdata.frame)に変換します。fct
  • vc次に、。を使用してベクトルでサブセット化できます[J(vc)]

注:キーが因子/文字変数の場合は使用することもできますが、が数値ベクトルのsetDT(dt, key = 'fct')[vc]場合は機能しません。が数値ベクトルであり、またはでラップされていないvc場合は、rowindexとして機能します。vcJ().()vc

キーとサブセットの概念のより詳細な説明は、ビネットキーと高速バイナリ検索ベースのサブセットにあります。

コメントで@Frankによって提案された代替案:

setDT(dt)[J(vc), on=.(fct)]

vcに存在しない値が含まれている場合はdt、次を追加する必要がありますnomatch = 0

setDT(dt, key = 'fct')[J(vc), nomatch = 0]

また:

setDT(dt)[J(vc), on=.(fct), nomatch = 0]
于 2017-03-29T17:55:33.603 に答える