R (tidyverse), inner_join

「計算用の数値を含むデータ」と、「各行を説明する名前 (symbol) や説明の文章などのデータ」という2つのテーブル同士を、それぞれに含まれる共通の列をキーに連結させたいことは、よくある処理だと思います。

このようなとき、R の tidyverse では、 inner_join() 関数を用いて、簡単に結合することができます。

例えば、下記のように2つのテーブルを読み込んだとします。

library(tidyverse)

input_data <- read_tsv("input_data.tsv")
meta_data  <- read_tsv("meta_data.tsv")

テーブルの中身は、下記のようなイメージです。2つのファイルも1列目に id の列を持ちます。

> # 計算用のデータ。
> input_data
# A tibble: 3 x 3
  Id    Sample1 Sample2
  <chr>   <dbl>   <dbl>
1 id1         1       4
2 id2         2       5
3 id3         3       6
>
>
>
> # 各行を説明するデータ。アノテーションの情報など。
> meta_data
# A tibble: 4 x 3
  Id    Symbol Description
  <chr> <chr>  <chr>
1 id1   AAA    lorem ipsum a
2 id2   BBB    lorem ipsum b
3 id3   CCC    lorem ipsum c
4 id4   DDD    lorem ipsum d

2つのテーブルの共通な列である Id をもとに、テーブルを結合するには、下記のように書けます。

result_data <- inner_join(input_data, meta_data)

実行結果は、下記のようになります。

> result_data <- inner_join(input_data, meta_data)
Joining, by = "Id"
> result_data
# A tibble: 3 x 5
  Id    Sample1 Sample2 Symbol Description
  <chr>   <dbl>   <dbl> <chr>  <chr>
1 id1         1       4 AAA    lorem ipsum a
2 id2         2       5 BBB    lorem ipsum b
3 id3         3       6 CCC    lorem ipsum c

Joining, by = “Id” となっていることで、 Id 列をもとに結合されたことが分かります。この場合は、2つのテーブルに同じ名前の列があるので、自動的に認識されています。明示的にキーの列を指定する場合は、inner_join(input_data, meta_data, by = "Id") と書きます。

また、結果のテーブル (result_data) では、元の input_data に含まれない id4 の行がないことが確認できます。

 

投稿者:

Atsushi Doi

株式会社セルイノベーター、主任研究員。理学博士。山口大学大学院理工学研究科修了。東京大学医科学研究所ヒトゲノム解析センターの特任助手を経て、株式会社GNIに主任研究員として勤務。その後、株式会社セルイノベーターの立ち上げに参加し、現在に至る。専門は、バイオインフォマティクス、おもにシステムバイオロジー。