base関数のファイル読み込みについて
職人の朝はデータの読み込みから始まる....
・ファイルを選択して読み込む
日常的によく使うのはchoose.files()を使ってfileのpathを取得して、
read csvなりtxtなりで読み取る方法。
ファイルの検索画面(エクスプローラー)が出るので便利。
file_path <- choose.files()
csv_data <- read.csv(file_path
ただこの方法だと分析途中で何を元ファイルとして指定したのか分からなくなったりする。
さらに、スクリプト全体を選択して実行すると毎回ファイル選択を聞かれるのでうるさく感じる。
使った後は素早くchoose.files()をコメントアウトしておくのがいいかと思います。
・場所を指定しておく
choose.files関数はファイルをエクスプローラーから検索してくれるので、探しながら、選びながら、が可能だった。
ファイル置き場やアウトプット用のフォルダが決まっているならばワーキングディレクトリを指定する。
setwd("C:\\users\\desktop\\csv_folder")
csv_data<-read.csv("data.csv")
ワーキングディレクトリを指定しておけばcsvファイルの名前だけを指定して読み込むことが出来る。
後から見返した時にどのcsvをどこで使用したのかわかるので便利。
・複数ファイルがあるとき
複数のcsvファイルがあり、プログマチックに読み込ませたい。
たとえばフォルダ内に01.csv,02.csv,03.csv・・・・・100.csvのように100個csvがある。
名前に規則性があるなら変数に名前をいれておいて、for文で実行するのもいいと思う。
01,01,03・・・というデータを使って図を描きたいとするなら以下のようになる。
for (i in 1:100){
csv_name<-paste0("0",i,".csv")
csv_data<-read.csv(csv_name)
png(paste0("0",i,".png"))
plot(csv_data)
dev.off()
}
これで01から100までのデータを読み込み、01.png, 02.png・・・ という名前で保存してくれる。
・ファイル名に規則性が無いとき
20150101.csv, 20170516.csv, 20180831.csv ・・・
などファイル名に規則性が無いときには、ファイルの置いてあるフォルダに入っている".csv"と名前につくものをリスト化してしまう。
file_list <- list.files()
これでファイル名すべてを取得できる。
csvしか入っていないフォルダなら、これですべて取ることができるが、
ワーキングディレクトリとして使用していて、他にもファイルがある場合、パターン指定を行う。
もちろんpath指定もできる。
file_listの一番目から順番にfor文で実行していけば上記のように自動的な読み込みができる。
file_list <- list.files("C:\\Users\\Desktop\\", pattern = ".csv")
for (i in 1:length(file_list)){
csv_data<-read.csv(file_list[i])
png(paste0(i,".png"))
plot(csv_data)
dev.off()
}
・ファイルを結合したい
上記のようにcsvファイルを読み込めたとしても、複数のcsvファイルを結合して一つのcsvにしたい時がある。
例えば、一行目と二行目にヘッダ情報があるが、ヘッダ情報は不要でまとめたい時。
二行目まで読み込まず、縦方向へ結合させていく。
ただそrbindは、列数が一致していなければならない。
また、事前に結合した結果を収納する箱を用意しておくこと。
file_list <- list.files("C:\\Users\\Desktop\\", pattern = ".csv")
bind_data <- NULL
for (i in 1:length(file_list)){
csv_data<-read.csv(file_list[i], skip=2)
bind_data<-rbind(bind_data, csv_data)
}
ヘッダーも欲しいときはskipでなくhedderを指定しよう。
ただし一行目だけが不要なときもある。
一行目だけスキップしてヘッダーを指定してもいい。
またまたrbindには制限があり、列名が異なっていると結合できない。
file_list <- list.files("C:\\Users\\Desktop\\", pattern = ".csv")
bind_data <- NULL
for (i in 1:length(file_list)){
csv_data<-read.csv(file_list[i], skip=1, header=T)
bind_data<-rbind(bind_data, csv_data)
}
これでヘッダー付きの結合ができるはず。
以上
これからちょこちょこ小技を記入していこうとおもう。