Rでjoinしたときの結果の確認方法
Rでjoin処理をしたときに、うまくjoinできているか確認したくなります。私なりに考えたやり方をメモとして残しておきます。
まずはデータを準備します。
今回はmapsパッケージにはいっているアメリカの州のポリゴンデータと、私が自作したNBAの選手の出身州が入っているデータ(nbastats)を使用します。
library(maps) library(nbastats) library(stringr) library(tidyverse) ### prepare data # US states polygon data states <- map_data("state") # NBA players' data data(players)
次にjoin処理を行う前に、結果を確認するための変数を作成しておきます。
ポリゴンデータ側はflg_sという変数を作成し、選手のデータ側はflg_pという変数を作成し、それぞれ"1"を入れておきます。
### data transformation before join # make flag variable to check the result of join states <- states %>% filter(!is.na(region)) %>% mutate(flg_s = "1") players <- players %>% filter(!is.na(birth_state)) %>% mutate(flg_p = "1", region = tolower(birth_state))
join処理を行います。このとき、full_joinにしてデータを全て残しておくのがポイントです。
### join after_join <- full_join(states, players, by = c("region"))
最後にjoin後のデータセットを使用して、flg_sとflg_pでグループ化を行い、クロス集計を行います。
### check the result of join after_join %>% group_by(flg_s, flg_p) %>% summarise(n = n()) > after_join %>% + group_by(flg_s, flg_p) %>% + summarise(n = n()) # A tibble: 3 x 3 # Groups: flg_s [2] flg_s flg_p n <chr> <chr> <int> 1 NA 1 385 2 1 NA 129 3 1 1 1346575
結果を見ると以下がわかります。
- マージキーがポリゴンデータ、選手データ両方に存在したデータ(flg_s = "1", flg_p = "1")は1,346,575件
- マージキーがポリゴンデータにはなかったが、選手のデータ側にはあった(flg_s = NA, flg_p = "1")件数は385件
- マージキーがポリゴンデータにはあったが、選手データにはなかった(flg_s = "1", flg_p = NA)件数が129件
今回使用したデータは、以下の特徴があります。
- ポリゴンデータ側はアメリカのハワイを除いた49州が全てはいっています。
- 一方、選手のデータは1人も出身選手がいない州や、アメリカ以外の国出身の選手がいるため、49州全てそろわず、49州以外のデータも入っています。
そのため、(flg_s, flg_p)=(NA, "1")と("1", NA)の案件が小数存在するのは妥当な結果です。
このように、もともとのデータの特性を踏まえて、joinできたデータとできなかったデータの件数をみることで、join処理が上手くできているかをある程度確認することができます。
以上