【R】複数ファイルのファイル名を列追加し、結合する

R
この記事は約4分で読めます。

メーカー系の顧客から提供されたデータが下記の状態のときに役立つ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によるモダンな分析フローの世界−を読んで実践を積めば、使いこなせるようになります。

コメント

タイトルとURLをコピーしました