2014-10-28 2 views
0

У меня есть список файлов с некоторыми данными, которые я хочу прочитать в R, а затем перебирать каждый файл для некоторых вычислений. До сих пор я был в состоянии читать файлы с помощью следующего кода:R - перебрать список файлов

method1

filenames<-list.files(pattern="*.txt") 
mynames<-gsub(".txt$", "", filenames) 
for (i in 1:length(mynames)) assign(mynames[i], read.table(filenames[i])) 

Однако при попытке применить какую-нибудь функцию «имена» он просто говорит, что NULL

lapply(mynames,nrow) 

Я знаю, что было бы проще читать файлы непосредственно в списке

METHOD2

temp<-list.files(pattern="*.txt") 
myfiles<-lapply(temp, read.table,skip="#") 

, а затем сделать это в этом списке lapply(myfiles,nrow), но это просто теряет информацию о том, какой файл создавал каждый список.

Есть ли способ обойти это с помощью любого из методов, чтобы отслеживать файл списка отношений?

Благодаря

+1

Я бы сказал, 'names' является вектором, а не список, вы можете проверить с помощью 'is.list (names)'. Кстати, не очень хорошая идея назвать переменную 'names'а, поскольку она уже является функцией в R ... – Cath

+0

@CathG благодарит, исправлены имена для mynames. is.list (mynames) возвращает FALSE, но даже если я делаю «mynames <-as.list (mynames)», а затем «lapply (mynames, nrow)», все равно возвращает NULL для всех элементов. – PedroA

+0

Я не удивлен. Вам лучше использовать sapply, поскольку mynames - это вектор, но, во всяком случае, mynames - это имена data.frame, а не data.frames, поэтому у них нет строк ... – Cath

ответ

2

Для первого способа, попробуйте

sapply(mynames,function(nameoffile){nrow(get(nameoffile))}) 
+0

есть ли способ сделать так, чтобы перебрать несколько имен? так как у меня может быть несколько. – PedroA

+0

Это дает вам количество строк для каждого файла, имя которого находится в mynames, или я не понимаю ваш вопрос? – Cath

+1

он! Отлично! – PedroA

4

Для метода 2 вы можете легко использовать seomething как

temp <- list.files(pattern = "*.txt") 
myfiles <- lapply(temp, read.table, skip = "#") 
names(myfiles) <- temp 

В этом случае атрибут names хранит имена файлов, и вы делаете не загромождать вашу рабочую среду новыми переменными.

Итак, когда вы хотите перебрать содержимое, которое можно использовать lapply(myfiles, function(.) nrow(.)) или, если вам нужно перебирать как имя файла и содержимое, которое может так что-то вроде lapply(names(myfiles), function(.) nrow(myfiles[[.]]))

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