歩いたら休め

If the implementation is easy to explain, it may be a good idea.

【R】データベースのマスターテーブルから、重複&データの不整合のあるidを取り出すための書き捨てコード

明らかにバッドノウハウですが、関数型プログラミングのライブラリであるpurrrのサンプルコードにある

data %>% split(.$カラム名) %>% purrr::map(データフレーム操作)

のコンボを上手く決められたので、せっかくなのでブログに貼り付けておきます。

github.com

データの入れ間違いがあり、マスターテーブルのid(cmp_id)に重複があるデータを調べる必要がありました。

cmp_id cmp_name media_type status
1 広告キャンペーン1 媒体1 1
2 広告キャンペーン2 媒体2 1
1 広告キャンペーン1 媒体3 0

ところが、idの重複がある上、同じid(cmp_id)/名前(cmp_name)なのに他のデータの内容が食い違っているものもありました。

そのため、データベースをRStudioから叩き、戻ってきた値から重複しているcmp_id、さらにその中からデータの食い違いのあるcmp_idを抽出するために書いたコードです。

library(dplyr)
library(purrr)
library(bigrquery)

# DB(BigQuery)からデータを取り出す
query <- "SELECT cmp_id, cmp_name, media_type, status FROM cmp_master_table"
data <- bigrquery::query_exec(query, project='example-proj-777')

# 重複しているcmp_idを取り出す
duplicate_cmp_ids <- data %>% 
  dplyr::group_by(cmp_id) %>% 
  dplyr::summarise(count=n()) %>% 
  dplyr::filter(count >= 2) %>% # 重複行の抽出 
  `$`(cmp_id) # ベクトルにして取り出す

# 不整合のあるデータを取り出す
inconsistent_cmp_ids <- data %>% 
  dplyr::filter(cmp_id %in% duplicate_cmp_ids) %>% 
  split(.$cmp_id) %>% # データフレームを、cmp_idをキーにした名前付きリストに分割
  purrr::map( # リストの全要素が重複している行数を図る処理をmapする
    . %>%
      dplyr::group_by(cmp_id, cmp_name, media_type, status) %>% 
      dplyr::summarise(count=n()) %>% 
      nrow()
    ) %>% 
  purrr::keep(~. >= 2) %>% # 行数が2以上のもののみを残す
  names() # 名前付きリストの名前を取り出す