- bind_rows( )を使って行を追加する
- bind_cols( )を使って列を追加する
- union( )で和集合を作る
- intersect( )で積集合を作る
- setdiff( )で差集合を作る
- おわりに
- 参考資料
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( )を使って行を追加する
上下方向にデータセットを結合させる。
> (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( )で和集合を作る
和集合、つまりどちらかに含まれている症例の集合を作る。
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( )で積集合を作る
どちらにも含まれる症例の集合を作る。
> 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( )で差集合を作る
setdiff(A, B)
として、Aに含まれるがBには含まれない症例の集合を作る。
> d1 %>% setdiff(d2) id time status trt age sex 1 2 4500 0 1 56.44627 f
おわりに
- 紐付けて結合するのに比べると使用頻度は少ないかもしれません。
参考資料
- 本家ページ