はだだだだ

定食にサラダは不要だと思う。

MENU

Rでjoinしたときの結果の確認方法

Rでjoin処理をしたときに、うまくjoinできているか確認したくなります。私なりに考えたやり方をメモとして残しておきます。

まずはデータを準備します。
今回はmapsパッケージにはいっているアメリカの州のポリゴンデータと、私が自作したNBAの選手の出身州が入っているデータ(nbastats)を使用します。

hadadada00.hatenablog.com

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_sflg_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処理が上手くできているかをある程度確認することができます。

以上