Rで10個のファイルを使用したいだけです。それぞれについて何かを計算したいです。経験値 ファイル: stat1_pwg1.out stat23_pwg2.out .. stat45_pwg10.out
私はこれを試します:
for (i in 1:10){
Data=paste("../XYZ/*_pwg",i,".out",sep="")
line=read.table(Data,head=T)
}
しかし、うまくいきませんか?何か問題はありますか?
Rで10個のファイルを使用したいだけです。それぞれについて何かを計算したいです。経験値 ファイル: stat1_pwg1.out stat23_pwg2.out .. stat45_pwg10.out
私はこれを試します:
for (i in 1:10){
Data=paste("../XYZ/*_pwg",i,".out",sep="")
line=read.table(Data,head=T)
}
しかし、うまくいきませんか?何か問題はありますか?
あなたの問題はワイルドカードに起因すると思われます*
。これを行うためのより良い方法は、最初に を使用してファイル名を保存しdir
、次に必要なものを見つけることです。
files <- dir("../XYZ",pattern="stat[0-9]+_pwg[0-9]+\.out")
for(f in files) {
line=read.table(Data,head=T)
}
apply
関数ファミリの 1 つを使用して、for ループを完全に排除することもできます。
コードに関するいくつかのこと。
paste
はベクトル化されているため、ループから外すことができます。
paste("../XYZ/*_pwg", 1:10, ".out", sep = "")
(すぐにわかるように、実際にはまったく使用する必要はありませんpaste
。)
read.table
ワイルドカードを受け入れません。ファイル名が完全に一致する必要があります。
dir
ファイル名のベクトルを構築しようとするのではなく、適切な命名スキームによってフィルタリングされた、ディレクトリに存在するファイルを見つけるために使用する方がよい場合があります。
ファイルをフィルタリングするには、パターン引数で正規表現を使用します。を使用して、ワイルドカードから正規表現に変換できますglob2rx
。
file_names <- dir("../XYZ", pattern = glob2rx("stat*_pwg*.out"))
data_list <- lapply(filenames, read.table, header = TRUE)
ワイルドカードが何よりも数字のみに一致する、もう少し具体的な適合については、正規表現を直接使用する必要があります。
file_names <- dir("../XYZ", pattern = "^stat[[:digit:]]+_pwg[[:digit:]]+\\.out$")