r tidyverse 使い方 | 2つのデータフレーム結合 inner_join関数 – dplyrパッケージ

スポンサーリンク

tidyverseで2つのデータフレームの結合は、dplyrパッケージのjoin系関数を使います。キーが共通する部分を結合するinner_join関数がよく使われます。2つのデータフレームの結合条件によって、その他のjoin系関数を使い分けます。2つのテーブルでデータが揃わない場合は「NA」になるので、適切に処理します。Rの標準的な操作の場合は、merge関数を使います。

  • inner_join: 指定したキーについて、どちらのデータフレームにも存在する行を結合
  • left_join: 指定したキーについて、左側に書いたデータフレームに存在する行を結合
  • right_join: 指定したキーについて、右側に書いたデータフレームに存在する行を結合
  • full_join: 指定したキーについて、データフレームのいずれかに存在するキーの行を結合
とにかく早く問題解決したい人はこちら>>こちらでデータ解析相談

inner_join

inner_join関数は、指定したキーについて「どちらのデータフレームにも存在する行」を結合します。tidyverseパッケージをロードすると使えるようになります。

書式

inner_join関数は、第1引数に左側データフレーム、第2引数に右側データフレームを指定します。同じ列名で自動で結合されますが、大文字・小文字の違いなどで列名が異なる場合、byキーワードで指定した列を結合します。尚、パイプ(%>%)を使って連続的に処理を記述する場合は、第1引数のデータは省略することができます。

共通の列で結合する

inner_join関数に結合するデータフレームを指定して、どちらのデータフレームにも存在する行を結合します。共通の列名があるのでデータフレームを指定するだけで結合可能です。

1: > library(tidyverse)
2: 
3: > my_data <- iris %>% slice(1, 51, 101)
4: > my_data$Species <- as.character(my_data$Species)
5:   Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
6: 1          5.1         3.5          1.4         0.2     setosa
7: 2          7.0         3.2          4.7         1.4 versicolor
8: 3          6.3         3.3          6.0         2.5  virginica
 1: > id <- tibble(
 2: + num = c(1, 2, 3),
 3: + Species = c("setosa", "virginica", "other")
 4: + )
 5: 
 6: > id
 7: # A tibble: 3 x 2
 8:     num Species  
 9:   <dbl> <chr>    
10: 1     1 setosa   
11: 2     2 virginica
12: 3     3 other
1: > id %>% inner_join(my_data)
2: # A tibble: 2 x 6
3:     num species   Sepal.Length Sepal.Width Petal.Length Petal.Width
4:   <dbl> <chr>            <dbl>       <dbl>        <dbl>       <dbl>
5: 1     1 setosa             5.1         3.5          1.4         0.2
6: 2     2 virginica          6.3         3.3          6           2.5

異なる列名で結合する

異なる列名で結合する場合、「by」で結合する列名をそれぞれ指定します。他のjoin系関数でも同様の指定方法です。

 1: > id <- tibble(
 2: + num = c(1, 2, 3),
 3: + species = c("setosa", "virginica", "other")
 4: + )
 5: 
 6: > id
 7: # A tibble: 3 x 2
 8:     num Species  
 9:   <dbl> <chr>    
10: 1     1 setosa   
11: 2     2 virginica
12: 3     3 other
1: > id %>% inner_join(my_data, by=c("species" = "Species"))
2: # A tibble: 2 x 6
3:     num species   Sepal.Length Sepal.Width Petal.Length Petal.Width
4:   <dbl> <chr>            <dbl>       <dbl>        <dbl>       <dbl>
5: 1     1 setosa             5.1         3.5          1.4         0.2
6: 2     2 virginica          6.3         3.3          6           2.5

left_join

left_join関数は、指定したキーについて「左側に書いたデータフレームに存在する行」を結合します。右側に存在しないデータは、「NA」になります。

1: > id %>% left_join(my_data)
2: # A tibble: 3 x 6
3:     num species   Sepal.Length Sepal.Width Petal.Length Petal.Width
4:   <dbl> <chr>            <dbl>       <dbl>        <dbl>       <dbl>
5: 1     1 setosa             5.1         3.5          1.4         0.2
6: 2     2 virginica          6.3         3.3          6           2.5
7: 3     3 other              NA          NA           NA          NA

right_join

right_join関数は、指定したキーについて「右側に書いたデータフレームに存在する行」を結合します。左側に存在しないデータは、「NA」になります。

1: > id %>% right_join(my_data)
2: # A tibble: 3 x 6
3:     num species    Sepal.Length Sepal.Width Petal.Length Petal.Width
4:   <dbl> <chr>             <dbl>       <dbl>        <dbl>       <dbl>
5: 1     1 setosa              5.1         3.5          1.4         0.2
6: 2    NA versicolor          7           3.2          4.7         1.4
7: 3     2 virginica           6.3         3.3          6           2.5

full_join

full_join関数は、指定したキーについて「データフレームのいずれかに存在するキーの行」を結合します。左側・右側に存在しないデータは、「NA」になります。

1: > id %>% full_join(my_data)
2: # A tibble: 4 x 6
3:     num species    Sepal.Length Sepal.Width Petal.Length Petal.Width
4:   <dbl> <chr>             <dbl>       <dbl>        <dbl>       <dbl>
5: 1     1 setosa              5.1         3.5          1.4         0.2
6: 2     2 virginica           6.3         3.3          6           2.5
7: 3     3 other               NA          NA           NA          NA  
8: 4    NA versicolor          7           3.2          4.7         1.4

NA の処理

join系関数で、データが揃わない場合は「NA」になります。replace_na関数を使うことで、「NA」を置き換えることができます。replace_na関数に「列名・置き換え」のセットを複数指定することができます。

1: > id %>% full_join(my_data) %>% replace_na(list(num="---", Sepal.Length="--", Petal.Width="--"))
2: Joining, by = "Species"
3: # A tibble: 4 x 6
4:   num   Species    Sepal.Length Sepal.Width Petal.Length Petal.Width
5:   <chr> <chr>      <chr>              <dbl>        <dbl> <chr>      
6: 1 1     setosa     5.1                  3.5          1.4 0.2        
7: 2 2     virginica  6.3                  3.3          6   2.5        
8: 3 3     other      --                   NA           NA   --         
9: 4 ---   versicolor 7                    3.2          4.7 1.4

Rの標準的な操作

2つのデータフレームの結合を行う場合、Rの標準的な方法ではmerge関数を使います。引数に結合するデータフレームを与えます。allオプションで、共通する行だけを残すか、どちらにしか存在しない行も残すかを指定できます。共通する列名がある場合、結合は自動で対応づけが行われます。共通しない列名で結合する場合、列名をそれぞれ指定します。

共通の列名で結合する場合

結合につかう列名を指定する必要はありません。

 1: > id <- data.frame(num = c(1, 2, 3),
 2: + Species = c("setosa", "virginica", "other")
 3: + )
 4: > id
 5:   num   Species
 6: 1   1    setosa
 7: 2   2 virginica
 8: 3   3     other
 9: 
10: > my_data <- iris[c(1, 51, 101),]
11: > my_data
12:     Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
13: 1            5.1         3.5          1.4         0.2     setosa
14: 51           7.0         3.2          4.7         1.4 versicolor
15: 101          6.3         3.3          6.0         2.5  virginica
16: 
17: > merge(id, my_data)
18:     Species num Sepal.Length Sepal.Width Petal.Length Petal.Width
19: 1    setosa   1          5.1         3.5          1.4         0.2
20: 2 virginica   2          6.3         3.3          6.0         2.5
21: 
22: merge(id, my_data, all=T)
23:      Species num Sepal.Length Sepal.Width Petal.Length Petal.Width
24: 1      other   3           NA          NA           NA          NA
25: 2     setosa   1          5.1         3.5          1.4         0.2
26: 3  virginica   2          6.3         3.3          6.0         2.5
27: 4 versicolor  NA          7.0         3.2          4.7         1.4

異なるの列名で結合する場合

結合につかう列名をそれぞれ指定します。「by.x」、「by.y」で指定します。

 1: colnames(id) <- c("num", "species")
 2: > id
 3:   num   species
 4: 1   1    setosa
 5: 2   2 virginica
 6: 3   3     other
 7: 
 8: merge(id, my_data, by.x="species", by.y="Species")
 9:     species num Sepal.Length Sepal.Width Petal.Length Petal.Width
10: 1    setosa   1          5.1         3.5          1.4         0.2
11: 2 virginica   2          6.3         3.3          6.0         2.5

まとめ

  • tidyverseのdplyrパッケージで提供される、join系関数を使って2つのデータフレームの結合を行います。同じ列名があれば、キーを省略できます。
  • 結合は条件によって関数を使い分けます。(inner_join, left_join, right_join, full_join)
  • 結合でデータが揃わない場合は「NA」になるので、replace_na関数などを使って適切に処理します。
  • Rの標準的な操作ではmerge関数を使います。

論文・データ解析の支援

とにかく早く問題解決したい人はこちら>>直接、データ解析相談
とにかく早く問題解決したい人はこちら>>こちらで論文相談

関連記事

r tidyverse 使い方 | 列分割 separate関数 - tidyrパッケージ
tidyverseで1つの列(文字列型)を分割して別の列に分けるには、tidyrパッケージのseparate関数を使います。separate関数は、「指定した列」を「指定した区切り文字」で分割します。Rの標準的な操作strsplit関数を使...
r tidyverse 使い方 | 行 グループ毎の処理 group_by関数 - dplyrパッケージ
tidyverseでデータフレームをグループ別に処理する場合、dplyrパッケージのgroup_by関数を使います。group_by関数以降の処理では、グループ毎に計算が行われます。Rの標準的な操作なら、apply系関数を使って同じような処...
r tidyverse 使い方 | データフレーム重複行を削除 distinct関数 - dplyrパッケージ
tidyverseでデータフレームの重複行の削除を行う場合、dplyrパッケージのdistinct関数を使います。重複をチェックする列名を指定し、重複が見つかった行は最初に見つかったデータを残して、それ以外は削除されます。Rの標準的な操作な...
r tidyverse 使い方 | 列の追加 mutate関数 - dplyrパッケージ
tidyverseでデータフレームに列を追加する場合は、dplyrパッケージのmutate関数を使います。新しい列を追加したり、既にある列に上書きすることができます。また、transmutateという関数を使った場合は、列を追加しつつ、se...
r tidyverse 使い方 | 行のソート arrange関数 - dplyrパッケージ
tidyverseで1つのデータフレームに対する行のソートは、dplyrパッケージのarrange関数を使います。arrange関数は、データフレームの行をソートする関数です。エクセルの行の並べ替えのように、優先度の高いものから複数の条件を...
dplyr filter関数で行の絞り込み | r tidyverse 使い方
dplyrパッケージのfilter関数をつかえば、データフレームの行の絞り込みができます。指定した条件を満たす行を絞り込みます。複数の条件を指定した場合、全ての条件を満たす行に絞りこまれます。 条件式では、論理演算&(AND)や、|(OR)...
r tidyverse 使い方 | 列 filter 絞り込み select関数 - dplyrパッケージ
tidyverseで1つのデータフレームの列の絞り込みは、dplyrパッケージのselect関数を使います。selectは条件を満たす列を絞り込む関数です。様々な指定方法で絞り込みができます。列名と文字列条件のマッチや正規表現を利用した絞り...
tidyverse csv・tsvのファイルの読み方・データ型の指定方法 readrパッケージ
tidyverseを使う場合、ファイルの読み書きにはreadrパッケージの専用関数(read_tsv関数・read_csv関数)を使うのが便利です。これらの専用関数ではデータ・フレーム構造より使いやすいtibble型でデータを読み込みますが...
tidyverse インストールとロード tidyverseの主なパッケージ
tidyverseはRのパッケージの1つで、データ操作(抽出・連結など)を統合的に扱うためのツール群です。Rを起動後に、tidyverseのインストールを行います。インストール完了後は、使うときにパッケージをロードして使います。 とにかく早...

タイトルとURLをコピーしました