【R】データフレームのデータを検索・抽出する方法まとめ【dplyr・filter・grep】

 

今回はデータフレームで特定のデータを検索し、抽出したい時などに使える方法をまとめて紹介します。

データフレーム作成に関してはこちらを確認してください。

【R】データフレームの作成から編集と操作まで

まずは下記のサンプルデータを読み込んでおいてください

library(MASS)
data(iris)
head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

インデックスを使った検索方法

行番号を指定してデータを抽出

iris[1:10,]
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.1         3.5          1.4         0.2  setosa
2           4.9         3.0          1.4         0.2  setosa
3           4.7         3.2          1.3         0.2  setosa
4           4.6         3.1          1.5         0.2  setosa
5           5.0         3.6          1.4         0.2  setosa
6           5.4         3.9          1.7         0.4  setosa
7           4.6         3.4          1.4         0.3  setosa
8           5.0         3.4          1.5         0.2  setosa
9           4.4         2.9          1.4         0.2  setosa
10          4.9         3.1          1.5         0.1  setosa

列番号を指定して抽出

iris[,1]
  [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1 5.7 5.1 5.4 5.1 4.6 5.1 4.8 5.0
 [27] 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0 5.5 4.9 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0 6.4
 [53] 6.9 5.5 6.5 5.7 6.3 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8 6.2 5.6 5.9 6.1 6.3 6.1 6.4 6.6 6.8 6.7
 [79] 6.0 5.7 5.5 5.5 5.8 6.0 5.4 6.0 6.7 6.3 5.6 5.5 5.5 6.1 5.8 5.0 5.6 5.7 5.7 6.2 5.1 5.7 6.3 5.8 7.1 6.3
[105] 6.5 7.6 4.9 7.3 6.7 7.2 6.5 6.4 6.8 5.7 5.8 6.4 6.5 7.7 7.7 6.0 6.9 5.6 7.7 6.3 6.7 7.2 6.2 6.1 6.4 7.2
[131] 7.4 7.9 6.4 6.3 6.1 7.7 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8 6.7 6.7 6.3 6.5 6.2 5.

行番号と列番号を指定して抽出

iris[1:10, 1]
[1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4

カラム名(header)をキーに指定した条件にマッチするデータを検索

文字列で検索

Speciesが「setosa」のものを検索

 

iris[iris$Species == "setosa", ]
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.1         3.5          1.4         0.2  setosa
2           4.9         3.0          1.4         0.2  setosa
3           4.7         3.2          1.3         0.2  setosa
4           4.6         3.1          1.5         0.2  setosa
5           5.0         3.6          1.4         0.2  setosa
6           5.4         3.9          1.7         0.4  setosa
7           4.6         3.4          1.4         0.3  setosa
8           5.0         3.4          1.5         0.2  setosa
9           4.4         2.9          1.4         0.2  setosa
10          4.9         3.1          1.5         0.1  setosa
・・・省略・・・
40          5.1         3.4          1.5         0.2  setosa
41          5.0         3.5          1.3         0.3  setosa
42          4.5         2.3          1.3         0.3  setosa
43          4.4         3.2          1.3         0.2  setosa
44          5.0         3.5          1.6         0.6  setosa
45          5.1         3.8          1.9         0.4  setosa
46          4.8         3.0          1.4         0.3  setosa
47          5.1         3.8          1.6         0.2  setosa
48          4.6         3.2          1.4         0.2  setosa
49          5.3         3.7          1.5         0.2  setosa
50          5.0         3.3          1.4         0.2  setosa

数値比較で検索

iris[iris$Sepal.Length > 7,]
    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
103          7.1         3.0          5.9         2.1 virginica
106          7.6         3.0          6.6         2.1 virginica
108          7.3         2.9          6.3         1.8 virginica
110          7.2         3.6          6.1         2.5 virginica
118          7.7         3.8          6.7         2.2 virginica
119          7.7         2.6          6.9         2.3 virginica
123          7.7         2.8          6.7         2.0 virginica
126          7.2         3.2          6.0         1.8 virginica
130          7.2         3.0          5.8         1.6 virginica
131          7.4         2.8          6.1         1.9 virginica
132          7.9         3.8          6.4         2.0 virginica
136          7.7         3.0          6.1         2.3 virginica

AND条件で検索

iris[iris$Sepal.Length > 6 & iris$Species == "versicolor", ]
   Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
51          7.0         3.2          4.7         1.4 versicolor
52          6.4         3.2          4.5         1.5 versicolor
53          6.9         3.1          4.9         1.5 versicolor
55          6.5         2.8          4.6         1.5 versicolor
57          6.3         3.3          4.7         1.6 versicolor
59          6.6         2.9          4.6         1.3 versicolor
64          6.1         2.9          4.7         1.4 versicolor
66          6.7         3.1          4.4         1.4 versicolor
69          6.2         2.2          4.5         1.5 versicolor
72          6.1         2.8          4.0         1.3 versicolor
73          6.3         2.5          4.9         1.5 versicolor
74          6.1         2.8          4.7         1.2 versicolor
75          6.4         2.9          4.3         1.3 versicolor
76          6.6         3.0          4.4         1.4 versicolor
77          6.8         2.8          4.8         1.4 versicolor
78          6.7         3.0          5.0         1.7 versicolor
87          6.7         3.1          4.7         1.5 versicolor
88          6.3         2.3          4.4         1.3 versicolor
92          6.1         3.0          4.6         1.4 versicolor
98          6.2         2.9          4.3         1.3 versicol

文字列のあいまい検索(grepを使った検索方法)

文字列のあいまい検索をする場合は「grep」関数を使用します。
下記の例は「versicolor」を「versi」であいまい検索していることを表しています。

iris[grep("versi", iris$Species), ]
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
51           7.0         3.2          4.7         1.4 versicolor
52           6.4         3.2          4.5         1.5 versicolor
53           6.9         3.1          4.9         1.5 versicolor
54           5.5         2.3          4.0         1.3 versicolor
55           6.5         2.8          4.6         1.5 versicolor
56           5.7         2.8          4.5         1.3 versicolor
57           6.3         3.3          4.7         1.6 versicolor
・・・省略・・・
94           5.0         2.3          3.3         1.0 versicolor
95           5.6         2.7          4.2         1.3 versicolor
96           5.7         3.0          4.2         1.2 versicolor
97           5.7         2.9          4.2         1.3 versicolor
98           6.2         2.9          4.3         1.3 versicolor
99           5.1         2.5          3.0         1.1 versicolor
100          5.7         2.8          4.1         1.3 versicolo

dplyrを使った検索方法

ここからはdplyrを使って、データフレームからデータを検索・抽出する方法をまとめていきます。

まずはパッケージ読み込見ましょう
※dplyrのバージョンは1.0.1で解説します(1.0以下だと、一部の関数が使えません)

library(dplyr)

パッケージをインストールしていない方は下記でインストールしましょう

install.packages("dplyr") 

行番号を指定して抽出

slice(iris, 1:5)
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.1         3.5          1.4         0.2  setosa
2           4.9         3.0          1.4         0.2  setosa
3           4.7         3.2          1.3         0.2  setosa
4           4.6         3.1          1.5         0.2  setosa
5           5.0         3.6          1.4         0.2  setosa

上からn行のデータを抽出

slice_head(n = 3)
# 下からn行のデータを抽出する場合
# slice_tail(n = 3)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa

文字列検索

filter(iris, Species == "versicolor")
   Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1           7.0         3.2          4.7         1.4 versicolor
2           6.4         3.2          4.5         1.5 versicolor
3           6.9         3.1          4.9         1.5 versicolor
・・・省略・・・
48          6.2         2.9          4.3         1.3 versicolor
49          5.1         2.5          3.0         1.1 versicolor
50          5.7         2.8          4.1         1.3 versicolor

この検索方法は先ほど紹介した下記と同じことを意味しています。

iris[iris$Species == "versicolor", ]

AND条件で検索

filter(iris, Sepal.Length > 6, Species == "versicolor")
   Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1           7.0         3.2          4.7         1.4 versicolor
2           6.4         3.2          4.5         1.5 versicolor
3           6.9         3.1          4.9         1.5 versicolor
4           6.5         2.8          4.6         1.5 versicolor
5           6.3         3.3          4.7         1.6 versicolor
6           6.6         2.9          4.6         1.3 versicolor
7           6.1         2.9          4.7         1.4 versicolor
8           6.7         3.1          4.4         1.4 versicolor
9           6.2         2.2          4.5         1.5 versicolor
10          6.1         2.8          4.0         1.3 versicolor
11          6.3         2.5          4.9         1.5 versicolor
12          6.1         2.8          4.7         1.2 versicolor
13          6.4         2.9          4.3         1.3 versicolor
14          6.6         3.0          4.4         1.4 versicolor
15          6.8         2.8          4.8         1.4 versicolor
16          6.7         3.0          5.0         1.7 versicolor
17          6.7         3.1          4.7         1.5 versicolor
18          6.3         2.3          4.4         1.3 versicolor
19          6.1         3.0          4.6         1.4 versicolor
20          6.2         2.9          4.3         1.3 versicolor

dplyr実践入門編

SpeciesでグルーピングしつつSepal.Lenghの合計でフィルタリング

Speciesでグルーピングをかけつつ、Sepal.Lengthのかくグループごとに合計し、その合計値が300より小さいグループを検索してみましょう。

iris %>%
  # Speciesでグルーピング
  group_by(Species) %>%
  # グループごとのSepal.Lenghの合計を求める
  summarise(total_sepal_length = sum(Sepal.Length)) %>%
  # Sepal.Length(total_sepal_length)の合計が300より小さいグループでフィルタ
  filter(total_sepal_length < 300)
  Species    total_sepal_length
1 setosa                   250.
2 versicolor               297.

フィルターをかけてから各グループの個数をカウント

今度は先にフィルターをかけてから各グループでの個数をカウントします。
また、個数の多いグループ順にそーともしてみましょう

iris %>%
  # Sepal.Lengthが5.5以上のレコードを抽出
  filter(Sepal.Length >= 5.5) %>%
  # 抽出結果をSpeciesでグルーピング
  group_by(Species) %>%
  # グループごとのレコード数をカウント
  summarise(count = n()) %>%
  # レコード数で降順にソート
  arrange(desc(count))
  Species    count
1 virginica     49
2 versicolor    44
3 setosa         5

参考

パーフェクトR