R言語でデータフレームを交差結合(cross join)する方法について解説します。データサイエンスにおいては、基準となる列の値を元に2つのデータフレームを結合して新たな1つのデータフレームを作成する操作を頻繁に使います。このような操作は結合の仕方によりいくつか種類がありますが、ここではその中でも交差結合と呼ばれる結合の仕方についてお伝えします。
交差結合は、2つのデータフレームの行において、結合のすべての組み合わせを含むデータフレームを取得する方法です。主に、次のような特徴があります。

  • 条件の指定はありません
  • 結果のデータフレームの行数は、(左側のデータフレームの行数)×(右側のデータフレームの行数)となります

交差結合を行うには、tidyverseパッケージに含まれているdplyrパッケージのcross_join()を使用します。

cross_join()の概要

cross_join()は、交差結合するための関数です。

cross_join()の使い方

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


cross_join(x, y, ..., copy = FALSE, suffix = c(".x", ".y"))

inner_join()の引数の意味

x

データフレームまたはデータフレーム拡張(例:tibble)、遅延データフレーム(例:dbplyrまたはdtplyrから)を指定します。

y

データフレームまたはデータフレーム拡張(例:tibble)、遅延データフレーム(例:dbplyrまたはdtplyrから)を指定します。

メソッドに渡されるその他のパラメーターです。

copy = FALSE

xとyが同じデータソースからのものではなく、copyがTRUEの場合、yはxと同じsrcにコピーされます。これにより、src間でデータフレームを結合できますが、コストがかかる可能性があるため、選択する必要があります。

suffix = c(“.x”, “.y”)

xとyに結合されていない重複列がある場合、これらの接尾辞は出力に追加され、曖昧さが解消されます。長さ2の文字ベクトルである必要があります。

準備

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


library(tidyverse)

解説のために、次のデータフレームを準備します。


df_l <- data.frame(
    L1 = seq(1, 7),
    L2 = paste(letters[1:7], seq(1, 7), sep = "_")
  )
df_r <- data.frame(
    R1 = seq(3, 9),
    R2 = paste(LETTERS[3:9], seq(3, 9), sep = "_")
  )

df_l

  L1  L2
1  1 a_1
2  2 b_2
3  3 c_3
4  4 d_4
5  5 e_5
6  6 f_6
7  7 g_7

df_r

  R1  R2
1  3 C_3
2  4 D_4
3  5 E_5
4  6 F_6
5  7 G_7
6  8 H_8
7  9 I_9

交差結合

データフレームdf_lとdf_rに対して、交差結合するには次のようにします。


df_l |>
  cross_join(df_r)

   L1  L2 R1  R2
1   1 a_1  3 C_3
2   1 a_1  4 D_4
3   1 a_1  5 E_5
4   1 a_1  6 F_6
5   1 a_1  7 G_7
6   1 a_1  8 H_8
7   1 a_1  9 I_9
8   2 b_2  3 C_3
9   2 b_2  4 D_4
10  2 b_2  5 E_5
11  2 b_2  6 F_6
12  2 b_2  7 G_7
13  2 b_2  8 H_8
14  2 b_2  9 I_9
15  3 c_3  3 C_3
16  3 c_3  4 D_4
17  3 c_3  5 E_5
18  3 c_3  6 F_6
19  3 c_3  7 G_7
20  3 c_3  8 H_8
21  3 c_3  9 I_9
22  4 d_4  3 C_3
23  4 d_4  4 D_4
24  4 d_4  5 E_5
25  4 d_4  6 F_6
26  4 d_4  7 G_7
27  4 d_4  8 H_8
28  4 d_4  9 I_9
29  5 e_5  3 C_3
30  5 e_5  4 D_4
31  5 e_5  5 E_5
32  5 e_5  6 F_6
33  5 e_5  7 G_7
34  5 e_5  8 H_8
35  5 e_5  9 I_9
36  6 f_6  3 C_3
37  6 f_6  4 D_4
38  6 f_6  5 E_5
39  6 f_6  6 F_6
40  6 f_6  7 G_7
41  6 f_6  8 H_8
42  6 f_6  9 I_9
43  7 g_7  3 C_3
44  7 g_7  4 D_4
45  7 g_7  5 E_5
46  7 g_7  6 F_6
47  7 g_7  7 G_7
48  7 g_7  8 H_8
49  7 g_7  9 I_9
R入門 データフレームを交差結合(cross join)する方法