mecobalamin’s diary

人間万事塞翁が馬

https://help.hatenablog.com/entry/developer-option

ファイルの読み込み

元データが複数あるなら
まとめて処理してくれると便利だ

例えば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]])
  }
}

やっていることは

  1. setosa, versicolor, virginicaを1セットとするので、フォルダ内のファイルリストを取得したあとに、リストからファイル名にsetosaが入るファイルを正規表現で探す
  2. 次にsetosaと、対になるversicolor, virginicaのファイル名を作り、read.table()で読み込む
  3. そして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

グラフは前回と一緒なので省略