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))}
Другие вопросы по тегам