ねこすたっと

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

データを単純に結合する操作(tidyverseパッケージ)[R]

2つのデータセットを単純に繋ぎ合わせるだけ。

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

> library(survival)
> set.seed(1234)
> data(pbc)
> d <- pbc[1:6,1:6]
> d[6,2:6] <- NA 
> d
  id time status trt      age  sex
1  1  400      2   1 58.76523    f
2  2 4500      0   1 56.44627    f
3  3 1012      2   1 70.07255    m
4  4 1925      2   1 54.74059    f
5  5 1504      1   2 38.10541    f
6  6   NA     NA  NA       NA <NA>

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

library(tidyverse)

bind_rows( )を使って行を追加する

図1:bind_rows()

上下方向にデータセットを結合させる。

> (d1 <- d %>% sample_n(size=4, replace=FALSE))
  id time status trt      age  sex
1  2 4500      0   1 56.44627    f
2  4 1925      2   1 54.74059    f
3  6   NA     NA  NA       NA <NA>
4  5 1504      1   2 38.10541    f
> (d2 <- d %>% sample_n(size=4, replace=FALSE))
  id time status trt      age  sex
1  6   NA     NA  NA       NA <NA>
2  4 1925      2   1 54.74059    f
3  5 1504      1   2 38.10541    f
4  1  400      2   1 58.76523    f

2セットのデータを作成した。

仮に変数の並びがズレていても、変数名を合わせて結合してくれる。

> d1 %>% bind_rows(d2) 
  id time status trt      age  sex
1  2 4500      0   1 56.44627    f
2  4 1925      2   1 54.74059    f
3  6   NA     NA  NA       NA <NA>
4  5 1504      1   2 38.10541    f
5  6   NA     NA  NA       NA <NA>
6  4 1925      2   1 54.74059    f
7  5 1504      1   2 38.10541    f
8  1  400      2   1 58.76523    f

distinct()を使って重複(症例4,5,6)を取り除くこともできる。

bind_cols( )を使って列を追加する

今度は横方向にデータを追加する。
症例の順番は揃っていることが条件。
ここではわざと症例順序を変えて結合させる。

> (d3 <- d %>% select(id, time, status, trt))
  id time status trt
1  1  400      2   1
2  2 4500      0   1
3  3 1012      2   1
4  4 1925      2   1
5  5 1504      1   2
6  6   NA     NA  NA
> (d4 <- d %>% select(id, age, sex) %>% arrange(age))
  id      age  sex
1  5 38.10541    f
2  4 54.74059    f
3  2 56.44627    f
4  1 58.76523    f
5  3 70.07255    m
6  6       NA <NA>
> d3 %>% bind_cols(d4)
New names:
* id -> id...1
* id -> id...5
  id...1 time status trt id...5      age  sex
1      1  400      2   1      5 38.10541    f
2      2 4500      0   1      4 54.74059    f
3      3 1012      2   1      2 56.44627    f
4      4 1925      2   1      1 58.76523    f
5      5 1504      1   2      3 70.07255    m
6      6   NA     NA  NA      6       NA <NA>

別の症例のデータが結合されてしまっている。
実際は患者IDなどで紐付けて結合する必要がある場合がほとんどなので、あまり使う機会はないかも。

union( )で和集合を作る

図2:union( )

和集合、つまりどちらかに含まれている症例の集合を作る。
bind_rows()後にdistinct()したのと同じ。

> d1 %>% union(d2)
  id time status trt      age  sex
1  2 4500      0   1 56.44627    f
2  4 1925      2   1 54.74059    f
3  6   NA     NA  NA       NA <NA>
4  5 1504      1   2 38.10541    f
5  1  400      2   1 58.76523    f

intersect( )で積集合を作る

図3:intersect( )

どちらにも含まれる症例の集合を作る。

> d1 %>% intersect(d2)
  id time status trt      age  sex
1  4 1925      2   1 54.74059    f
2  6   NA     NA  NA       NA <NA>
3  5 1504      1   2 38.10541    f

setdiff( )で差集合を作る

図4:setdiff( )

setdiff(A, B)として、Aに含まれるがBには含まれない症例の集合を作る。

> d1 %>% setdiff(d2)
  id time status trt      age sex
1  2 4500      0   1 56.44627   f

おわりに

  • 紐付けて結合するのに比べると使用頻度は少ないかもしれません。

参考資料

  • 本家ページ

dplyr.tidyverse.org