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

bind_cols()の概要

bind_cols()は、複数のデータフレームを列ごとに結合するための関数です。bind_cols()は、任意の数のデータフレームを列ごとに結合して、より広い結果を作成します。これはdo.call(cbind, dfs)と似ています。

bind_cols()の使い方

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


bind_cols(
  ...,
  .name_repair = c("unique", "universal", "check_unique", "minimal")
)

bind_cols()の引数の意味

結合するデータフレームを指定します。
各引数は、データフレームまたはデータフレームのリストです。入力は同じ長さにリサイクルされ、位置によって一致します。

.name_repair = c(“unique”, “universal”, “check_unique”, “minimal”)

「unique」、「universal」、「check_unique」のいずれかを指定します。

  • unique: 重複した列名は、一意になるように接尾辞(サフィックス)が追加されます
  • universal: 構文の規則に従う一意的な列名を割り当てることで、エラーを発生させません
  • check_unique: 列名の修復は実行さず、代わりに列名が「unique」基準に適合しない場合はエラーが発生します

準備

あらかじめ、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 |>
  select(Sepal.Length, Sepal.Width)

df_iris1  |>
  head()

  Sepal.Length Sepal.Width
1          5.1         3.5
2          4.9         3.0
3          4.7         3.2
4          4.6         3.1
5          5.0         3.6
6          5.4         3.9

df_iris2 <- iris |>
  select(Petal.Length, Petal.Width, Species)

df_iris2  |>
  head()

  Petal.Length Petal.Width Species
1          1.4         0.2  setosa
2          1.4         0.2  setosa
3          1.3         0.2  setosa
4          1.5         0.2  setosa
5          1.4         0.2  setosa
6          1.7         0.4  setosa

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 |>
  select(mpg, cyl, disp, hp, drat, wt, qsec)

df_mtcars1 |>
  head()

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

df_mtcars2 <- mtcars |>
  select(vs, am, gear, carb)

df_mtcars2 |>
  head()

                  vs am gear carb
Mazda RX4          0  1    4    4
Mazda RX4 Wag      0  1    4    4
Datsun 710         1  1    4    1
Hornet 4 Drive     1  0    3    1
Hornet Sportabout  0  0    3    2
Valiant            1  0    3    1

横方向への単純結合

bind_cols()を使用して、複数のデータフレームを横方向に単純結合するには、それぞれのデータフレームの行数が等しくなければいけません。df_iris1とdf_iris2に対して、bind_cols()を使用すると次のようになります。


df_iris1 |>
  bind_cols(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_df_mtcars2に対して、bind_cols()を使用すると次のようにエラーとなります。


df_iris1 |>
  bind_cols(df_mtcars1) |>
  head()

Error in `bind_cols()`:
! Can't recycle `..1` (size 150) to match `..2` (size 32).
Run `rlang::last_trace()` to see where the error occurred.
R入門 複数のデータフレームを横方向に単純結合する方法