R читать файлы с помощью цикла
Я просто хочу использовать 10 файлов в R. Для каждого я хочу что-то посчитать. Exp. файл: 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)
}
Но это не работает? Есть какие-нибудь препятствия?
3 ответа
Я подозреваю, что ваша проблема исходит от подстановочного знака *
, Лучший способ сделать это - сначала сохранить имена файлов, используя dir
затем найдите те, которые вы хотите.
files <- dir("../XYZ",pattern="stat[0-9]+_pwg[0-9]+\.out")
for(f in files) {
line=read.table(Data,head=T)
}
Вы также можете использовать один из apply
семейство функций, чтобы полностью исключить цикл 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$")
files <- dir(pattern="*Rip1_*")
files
for (F in files){ assign(F , Readfunc(F))}