2012-03-27 3 views
2

Я пытаюсь прочитать несколько файлов в R из рабочего каталога и хотел бы прочитать как читать из 7-й строки для каждого файла. Я не знаю, как я могу это сделатьЧтение нескольких файлов в каталоге, начиная с определенной строки

я нашел, как читать отдельный файл с этим:

data = read.csv(file.choose(), skip = 6) 

или я могу прочитать несколько файлов, как это:

j = list.files()   
    d = lapply(j, read.csv) 

могли бы вы помогите мне, как я могу читать несколько файлов, начиная с 7-й строки?

+1

На странице справки '... дополнительные аргументы для FUN'. В вашем примере 'read.csv' == FUN, поэтому вы можете просто передать дополнительные аргументы после объявления FUN, т. Е.' Lapply, j, read.csv, skip = 6) '. Подробнее см. '? Lapply'. – Chase

ответ

2

В дополнение к @ ответ Джеймс, используя lapply только читает файлы в списке, а не в общей data.frame. С вашего вопроса это не очевидно, если вы этого хотите. Но я все равно добавлю его для полноты.

Чтобы определить, к какому файлу принадлежит строка в общем data.frame, я часто добавляю столбец с именем файла. В псевдокоде это будет выглядеть примерно так:

files = list.files() 
data_list = lapply(files, function(f) { 
    dat = read.csv(fname, skip = 6) 
    dat$fname = fname 
    return(dat) 
    }) 
data_df = do.call("rbind", data_list) 

В качестве альтернативы, вы можете использовать удивительную plyr библиотеку, которая делает ту же самую вещь в:

library(plyr) 
files = list.files() 
data_df = ldply(files, read.csv, skip = 6) 

Я не проверял этот псевдо-код , так что может быть, что есть некоторые недостатки. Но вы получаете основную идею. Например, одна из проблем может заключаться в том, что ldply автоматически не добавляет имя файла в виде столбца. Затем вам нужно использовать вызов функции, как я сделал, используя lapply. В этом случае ldply сэкономит вам шаг do.call. Обратите внимание: plyr поддерживает индикатор выполнения (отлично подходит для длительных процессов) и параллельной обработки.

примечание:

  • мне нравится больше, чем описательные имена j и d. Это упрощает чтение кода.
+0

thats thats объясняет многое с проблемой, которую я имею сейчас! :) – Achak

6

Просто соедините два. Вы можете передать в именованных аргументов функции в lapply:

d <- lapply(j, read.csv, skip=6) 
+0

Спасибо, вот что я подумал, я, должно быть, написал что-то не так, я пробовал это раньше и не работал, теперь работаю просто отлично :) – Achak

Смежные вопросы