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入門 複数のデータフレームを横方向に単純結合する方法