背景
コンピュータプログラムを使って実験を行った際に、参加者一人一人のデータを、csvやtxtファイルで出力する場合があると思います。データ分析する際に、このばらばらのデータを一つのデータセットにまとめてRに読み込む方法を紹介します。
手順
データ
例えば、以下のような形式でデータが記録されたcsvファイルが複数あるとします。
手順
- 必要なパッケージのインストール
utilsパッケージ
→ read.csv関数、write.table関数を使うのに必要
- ファイルがあるディレクトリを選び、そのディレクトリのファイルをすべて指定します。patternという引数もあり、ここで正規表現を使えます。例えば、ドキュメントフォルダにある、"Japanese"という名前を含んでいるファイルのみを取得したい場合の例は以下です。
pattern = ".pdf"
のように指定すれば、PDFファイルだけ取得できます。
setwd("C:/Users/mt/Documents")
file_list <- list.files(pattern = "Japanese")
ちなみに、list.files関数にpathという引数を指定すれば、一行で書けます。
file_list <- list.files(path = "C:/Users/mt/Documents",
pattern = "Japanese")
- 次に示すスクリプトを実行するだけで結合できます
#結合開始
bind_data <- NULL
for (i in 1:length(file_list)){ #一つ一つ、ファイルの数だけ結合する
csv_data<-read.csv(file_list[i])
bind_data<-rbind(bind_data, sapply(csv_data, as.character))
}
追記(2023/08/20)
X(旧twitter)にて、より短いコードで、より高速に実行できる、read_csv関数を教えていただきました。
ボブさん、ありがとうございます。複数のcsvファイルの読み込みはreadr::read_csv()で一発で行けますよ。
— ボブさん (@bob3bob3) August 20, 2023
# testフォルダ内のcsvファイルを全部読む場合
library(tidyverse)
file_list <- list.files("test/", pattern = ".csv", full.names = TRUE)
bind_data <- read_csv(file_list, id = "file_name")
library(tidyverse)
bind_data <- readr::read_csv(file_list, id = "file_name")
データセットの完成です。あとはそのまま分析するだけ。
データセットの保存方法
任意のファイル形式で作成したデータセットを保存できます。
write.table(bind_data,
"好きなファイル名.csv", #.csvという拡張子を忘れない
sep = "\t", #タブで区切られているデータ。区切りごとに変える必要あり
quote = FALSE,
row.names = FALSE) #データの型で関数(write.table)変える必要あり
ちなみに、保存先を指定することができます。例えば、"好きなファイル名.csv"のファイル名の前に、絶対パスを指定する方法があります。以下のように指定すると、新しく作成したファイルがドキュメントに保存されます。
write.table(bind_data,
"C:/Users/mt/Documents/好きなファイル名.csv",
sep = "\t",
quote = FALSE,
row.names = FALSE)
# 最後に
改善点の一つとして、とてつもなく大量のデータがある場合、forを使うループはかなり時間がかかってしまいます。for文を使わずに同じことができる方法を探ることがあげられます。
参考:# 追記(2023/08/20)