メーカー系の顧客から提供されたデータが下記の状態のときに役立つRによる前処理を共有します。
データの状態
・生データは「結果系データ」と「原因系データ」の2種類(csvファイル)
・結果系データにはロット番号のカラムがある
・原因系データにはロット番号のカラムは存在せず、ファイル名がロット番号になっている
・原因系データはロットごとにファイルが分かれている(1ファイルあたり7000行)
やりたいこと
・結果系データと原因系データを 「ロット番号」 をキーにして結合する
そのために、
①原因系データにカラム「ロット番号」を追加する
(ファイル名からロット番号を切り取ってカラムに追加する)
②複数の原因系データをマージ(ユニオン結合)してファイル出力
①②をRで実装する
library(data.table) library(dplyr) #サンプルデータの作成 d1 <- data.frame(1:7000, runif(7000, min = 1, max = 100)) colnames(d1) <- c("col1", "col2") #カラム名(列名)変更 d2 <- data.frame(7001:14000, runif(7000, min = 1, max = 400)) colnames(d2) <- c("col1", "col2") d3 <- data.frame(14001:21000, runif(7000, min = 1, max = 800)) colnames(d3) <- c("col1", "col2") #サンプルデータをローカルフォルダに保存 fwrite(d1,"C:/WORK/input/Lot1.csv") fwrite(d2,"C:/WORK/input/Lot2.csv") fwrite(d3,"C:/WORK/input/Lot3.csv") #ここから本題 #サンプルデータがの保存先ファルダを作業ディレクトリの設定 setwd("C:/WORK/input") #ディレクトリ中のファイル一覧を取得 files <- list.files() #「.csv」拡張子を持つファイルをリストアップ csv.files <- grep("\\.csv$",files) #カラム「ロット番号」の追加&ファイルマージ&出力 file.remove("C:/WORK/output/merged.csv") for(i in 1:length(csv.files)){ tmp <- fread(paste0("C:/WORK/input/",files[i]),encoding = "UTF-8",sep=",") LotNo <- sub(".csv","",files[i]) #文字の置換(.csvを空文字で置換) tmp2 <- tmp %>% mutate(LotNo)#カラム「ロット番号」の追加 fwrite(tmp2,"C:/WORK/output/merged.csv",#ファイル出力 sep=",",col.names = F,row.names = F,quote = F,append = T)#append = T:行追加を許容 } #本題ここまで #おまけ merged <- fread("C:/WORK/output/merged.csv",encoding = "UTF-8",sep=",") #マージ済みファイルの読み込み setnames(merged,c("col1","col2","LotNo")) #列名変更 #LotNoごとの基本統計量を計算 Aggregate <- merged %>% group_by(LotNo) %>% summarise(col2_avg = mean(col2),#平均 col2_var = var(col2), #分散 col2_min = min(col2), #最小 col2_max = max(col2) #最大 ) Aggregate
サイズが大きいファイルを高速に入出力したいときは、data.tableパッケージのfread()とfwrite()がおすすめ。
基本統計量の集計は、dplyrパッケージのsummarise()を使えば楽ちんです。
dplyrパッケージ によるデータ処理については、RユーザのためのRStudio[実践]入門−tidyverseによるモダンな分析フローの世界−を読んで実践を積めば、使いこなせるようになります。
コメント