dplyrパッケージのjoin_by関数に複数の結合の条件を指定してsemi_join関数、anti_join関数を使う。結合の条件を,(コンマ)で区切る。以下は、あらかじめ用意した二つのデータフレームを、結合できるか否か調べた例。
> dtf1
company title character
1 miHoYo 崩壊3rd セナディア
2 miHoYo 崩壊:スターレイル キャストリス
3 miHoYo 崩壊:スターレイル 帰望の流離人
4 miHoYo ゼンレスゾーンゼロ リン
5 KURO GAMES 鳴潮 カンタレラ
> dtf2
sakuhin kyara seiyu
1 崩壊3rd ヴィタ 日笠陽子
2 崩壊3rd セナディア 鈴木みのり
3 崩壊:スターレイル 帰望の流離人 高田憂希
4 ゼンレスゾーンゼロ アストラ 遠藤綾
5 鳴潮 カンタレラ 中原麻衣
> library(dplyr)
semi_join関数は、右側に指定の列の値が一致する行がある左側の行を返す。inner_join関数と動作は似ているが、semi_join関数は、結合はせずに結合可能な左側の行だけを返す。
> dtf1 |> inner_join(dtf2, by = join_by(title == sakuhin, character == kyara))
company title character seiyu
1 miHoYo 崩壊3rd セナディア 鈴木みのり
2 miHoYo 崩壊:スターレイル 帰望の流離人 高田憂希
3 KURO GAMES 鳴潮 カンタレラ 中原麻衣
> dtf1 |> semi_join(dtf2, by = join_by(title == sakuhin, character == kyara))
company title character
1 miHoYo 崩壊3rd セナディア
2 miHoYo 崩壊:スターレイル 帰望の流離人
3 KURO GAMES 鳴潮 カンタレラ
anti_join関数は、右側に指定の列の値が一致する行がない左側の行を返す。left_join関数では無理矢理結合されて列にNAが代入された行(以下の2,4行目)も返されるが、anti_join関数は結合はせずに左側の行だけを返す。
> dtf1 |> left_join(dtf2, by = join_by(title == sakuhin, character == kyara))
company title character seiyu
1 miHoYo 崩壊3rd セナディア 鈴木みのり
2 miHoYo 崩壊:スターレイル キャストリス <NA>
3 miHoYo 崩壊:スターレイル 帰望の流離人 高田憂希
4 miHoYo ゼンレスゾーンゼロ リン <NA>
5 KURO GAMES 鳴潮 カンタレラ 中原麻衣
> dtf1 |> anti_join(dtf2, by = join_by(title == sakuhin, character == kyara))
company title character
1 miHoYo 崩壊:スターレイル キャストリス
2 miHoYo ゼンレスゾーンゼロ リン