ファイルの読み込み
元データが複数あるなら
まとめて処理してくれると便利だ
例えばirisのデータが種類ごとに分かれていて
かつ地域ごとに保存されているとする
chibaとsaitamaの2地域で、3種類に分かれている場合がこれ
180910_Iris-data_chiba_setosa_results.txt 180910_Iris-data_chiba_versicolor_results.txt 180910_Iris-data_chiba_virginica_results.txt 180912_Iris-data_saitama_setosa_results.txt 180912_Iris-data_saitama_versicolor_results.txt 180912_Iris-data_saitama_virginica_results.txt
ファイルの中身はこんな感じ
irisを出力しただけ
"ID","Sepal.Length","Sepal.Width","Petal.Length","Petal.Width","Species" "1",5.1,3.5,1.4,0.2,"setosa" "2",4.9,3,1.4,0.2,"setosa" "3",4.7,3.2,1.3,0.2,"setosa" "4",4.6,3.1,1.5,0.2,"setosa" "5",5,3.6,1.4,0.2,"setosa" ~省略~
ファイル名は
"日付_Iris-data_場所_種名_Results.txt"
というフォーマットにする
フォーマットを揃えるのは重要
IDは3つのファイルで通し番号になっているが
個別についていても大丈夫そう
これを前回の関数を使って地域ごとに散布図にしたい
読み込む関数がこちら
ReadFiles <- function(){ Sp.Files <- list.files() #フォルダ内のファイルのリストを返す for(File.Name in Sp.Files){ #ファイルの数だけ繰り返す #"日付_Iris-data_場所_種名_Results.txt" if(regexpr("_Iris-data[_[:graph:]]*_setosa_results.txt$", File.Name) < 0){ next } Split.Name <- strsplit(File.Name, "_") #ファイル名を"_"で分ける File.Name.First <- paste(Split.Name[[1]][[1]], Split.Name[[1]][[2]], Split.Name[[1]][[3]], sep = "_") File.Name.Second <- Split.Name[[1]][[5]] File.Setosa <- paste(File.Name.First, "setosa", File.Name.Second, sep="_") File.Versicolor <- paste(File.Name.First, "versicolor", File.Name.Second, sep="_") File.Virginica <- paste(File.Name.First, "virginica", File.Name.Second, sep="_") Data.Setosa <- na.omit(read.table(File.Setosa, header = TRUE, sep=",")) Data.Versicolor <- na.omit(read.table(File.Versicolor, header = TRUE, sep=",")) Data.Virginica <- na.omit(read.table(File.Virginica, header = TRUE, sep=",")) Label.Name <- c("ID", "Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species") colnames(Data.Setosa) <- Label.Name colnames(Data.Versicolor) <- Label.Name colnames(Data.Virginica) <- Label.Name Data.All <- rbind(Data.Setosa, Data.Versicolor, Data.Virginica) Data.All <- Data.All[,-1] Species.List <- as.character(unique(Data.All$Species)) Col.Data <- colnames(Data.All) MakingSDGraph(Data.All, Species.List, Col.Data[5], Col.Data, Split.Name[[1]][[1]], Split.Name[[1]][[3]]) } }
やっていることは
- setosa, versicolor, virginicaを1セットとするので、フォルダ内のファイルリストを取得したあとに、リストからファイル名にsetosaが入るファイルを正規表現で探す
- 次にsetosaと、対になるversicolor, virginicaのファイル名を作り、read.table()で読み込む
- そしてcolnames()でカラム名を揃えてデータを結合する
regexpr()はパターンマッチを行う関数で引数に正規表現が使える
文字列 | R で文字列の切り出しや置換などの文字列処理を行う方法
R における正規表現 - RjpWiki
ReadFiles()から前回の関数MakingSDGraph()を呼び出して
結合したデータを前回と同じように処理をする
MakingSDGraph()は引数が2つ増えている
これは出力ファイルに元ファイルの日付と地域名を入れるための変更
関数にも一部変更を加える
MakingSDGraph <- function(data.all, sp.list, col.name, col.list, sample.date, sample.location){ # データごとの色の定義 data.color <- data.all[col.name] # グラフを書き込むファイルの用意, 5x5の領域を確保する png.name = sprintf("SD-Hist_%s_%s.png", sample.date, sample.location)
出力されたファイルには元ファイルの日付と地域名が入っている
SD-Hist_180910_chiba.png SD-Hist_180912_saitama.png
グラフは前回と一緒なので省略