ねこすたっと

ねこの気持ちと統計について悩む筆者の備忘録的ページ。

データをキーを使って結合する操作(tidyverseパッケージ)[R]

2つのデータセットに共通の変数を使って紐つける。

survivalパッケージのpbcデータセットを使って作成したサンプルデータを結合させてみる。

> library(survival)
> set.seed(1234)
> data(pbc)
> d <- pbc[1:6,1:6]
> d[6,2:6] <- NA 
> (d5 <- d %>% sample_n(size=4, replace=FALSE) %>% select(id, time, status, trt))
  id time status trt
1  6   NA     NA  NA
2  3 1012      2   1
3  4 1925      2   1
4  5 1504      1   2
> (d6 <- d %>% sample_n(size=4, replace=FALSE) %>% select(id, age, sex))
  id      age sex
1  1 58.76523   f
2  3 70.07255   m
3  2 56.44627   f
4  4 54.74059   f

2つのデータセットでid以外の変数は異なる。
また、症例3,4はどちらのデータセットにも含まれている。

tidyverseパッケージを読み込んでおく。

library(tidyverse)

left_join( )を使って左側データを基準に結合する

図1:left_join( )

紐付けのための共通の変数はkeyで指定する。

> d5 %>% left_join(d6, key="id")
Joining, by = "id"
  id time status trt      age  sex
1  6   NA     NA  NA       NA <NA>
2  3 1012      2   1 70.07255    m
3  4 1925      2   1 54.74059    f
4  5 1504      1   2       NA <NA>

左側のデータ、つまりd5に含まれている症例6,3,4,5に対して変数が追加された。
左側データにあるが右側データに含まれない症例に対してはNAが結合されている。

同様に右側のデータを基準にするright_join()もあるが用例は割愛。

図2:right_join( )

結合キーの名前が異なる・複数の結合キーを使う場合

2つのデータセットで紐付けのための変数の名前が違う場合はby=c()で指定する。
また複数のキーを指定すれば、それらが全て一致する症例のみ結合される。

left_join(data1, data2, by = c("x1" = "x2", "y1" = "y2"))

inner_join( )を使って両方に含まれる場合のみ結合する

図3:inner_join( )

積集合となる集団に対してのみ、変数を追加する。

> d5 %>% inner_join(d6, key="id")
Joining, by = "id"
  id time status trt      age sex
1  3 1012      2   1 70.07255   m
2  4 1925      2   1 54.74059   f

元データに欠測がなければNAは発生しない。

full_join( )を使ってどちらかに含まれるならば結合する

図4:full_join( )

和集合となる集団に対して変数を追加する。

> d5 %>% full_join(d6, key="id")
Joining, by = "id"
  id time status trt      age  sex
1  6   NA     NA  NA       NA <NA>
2  3 1012      2   1 70.07255    m
3  4 1925      2   1 54.74059    f
4  5 1504      1   2       NA <NA>
5  1   NA     NA  NA 58.76523    f
6  2   NA     NA  NA 56.44627    f

共通部分が少なければNAが大量発生する。

おわりに

  • 実際にはleft_joinを使う機会が圧倒的に多い
  • ネコがおもちゃで遊んでくれるかどうかはこちらの技量にかかっていると痛感してます

参考資料

  • わかりやすい前田和寛(@kazutan)先生のページ

kazutan.github.io

  • 本家ページ

dplyr.tidyverse.org