R言語で複数のデータフレームを縦方向に単純結合する方法について解説します。このような方法はいくつかあり、R言語に標準で搭載されている機能を使用した方法もありますが、ここではtidyverseパッケージに含まれているdplyrパッケージのbind_rows()を使用した方法についてお伝えします。

bind_rows()の概要

bind_rows()は、複数のデータフレームを行ごとに結合するための関数です。bind_rows()は、任意の数のデータフレームを行ごとに結合して、データフレームを縦に長くします。

bind_rows()の使い方

dplyr::bind_rows()の使い方は次になります。


bind_rows(..., .id = NULL)

bind_rows()の引数の意味

結合するデータフレームを指定します。
各引数は、データフレームまたはデータフレームのリストです。列は名前で一致し、欠落している列はNAで埋められます。

.id = NULL

オプションの識別子列の名前をで各入力を識別する出力列を作成するための文字列を指定します。
列には、使用可能な場合は名前が使用され、それ以外の場合は位置が使用されます。

準備

あらかじめ、tidyverseパッケージを読み込んでおきます。


library(tidyverse)

解説のために、次のirisデータセットとmtcarsデータセットのそれぞれの分割データセットを使用します。


iris |>
  head()

  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

df_iris1 <- iris |>
  slice(1:75)

df_iris1  |>
  head()

  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

df_iris2 <- iris |>
  slice(76:150)

df_iris2  |>
  head()

  Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1          6.6         3.0          4.4         1.4 versicolor
2          6.8         2.8          4.8         1.4 versicolor
3          6.7         3.0          5.0         1.7 versicolor
4          6.0         2.9          4.5         1.5 versicolor
5          5.7         2.6          3.5         1.0 versicolor
6          5.5         2.4          3.8         1.1 versicolor

mtcars |>
  head()

                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

df_mtcars1 <- mtcars |>
  slice(1:16)

df_mtcars1 |>
  head()

                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

df_mtcars2 <- mtcars |>
  slice(17:32)

df_mtcars2 |>
  head()

                   mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Chrysler Imperial 14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
Fiat 128          32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
Honda Civic       30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
Toyota Corolla    33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
Toyota Corona     21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
Dodge Challenger  15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2

同じ列名を持つ複数のデータフレームの縦方向への単純結合

df_iris1とdf_iris2に対して、bind_rows()を使用すると次のようになります。


df_iris1 |>
  bind_rows(df_iris2) |>
  head()

  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

異なる列名を持つ複数のデータフレームの縦方向への単純結合

df_iris1とdf_mtcars1に対して、bind_rows()を使用すると次のようになります。


df_iris1 |>
  bind_rows(df_mtcars1) |>
  slice(72:78)

              Sepal.Length Sepal.Width Petal.Length Petal.Width    Species  mpg cyl disp  hp drat    wt  qsec vs am gear carb
...1                   6.1         2.8          4.0         1.3 versicolor   NA  NA   NA  NA   NA    NA    NA NA NA   NA   NA
...2                   6.3         2.5          4.9         1.5 versicolor   NA  NA   NA  NA   NA    NA    NA NA NA   NA   NA
...3                   6.1         2.8          4.7         1.2 versicolor   NA  NA   NA  NA   NA    NA    NA NA NA   NA   NA
...4                   6.4         2.9          4.3         1.3 versicolor   NA  NA   NA  NA   NA    NA    NA NA NA   NA   NA
Mazda RX4               NA          NA           NA          NA       <NA> 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag           NA          NA           NA          NA       <NA> 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710              NA          NA           NA          NA       <NA> 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
R入門 複数のデータフレームを縦方向に単純結合する方法