明らかにバッドノウハウですが、関数型プログラミングのライブラリであるpurrrのサンプルコードにある
data %>% split(.$カラム名) %>% purrr::map(データフレーム操作)
のコンボを上手く決められたので、せっかくなのでブログに貼り付けておきます。
データの入れ間違いがあり、マスターテーブルの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() # 名前付きリストの名前を取り出す