2014-10-28 166 views
0

我有一些文件的列表,其中包含一些我想读入R的数据,然后遍历每个文件进行一些计算。 到目前为止,我能够用下面的代码读取文件:R - 遍历文件列表

方法一

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该名单lapply(myfiles,nrow),但这只是松动有关的文件制作的每个列表中的信息。

有没有办法绕过这两种方法来跟踪关系列表文件?

感谢

+1

我想说的内容'names'是一个向量的内容,不是列表,你可以用'is.list(names)'来检查。顺便说一下,不是一个很好的主意,因为它已经是一个函数... – Cath 2014-10-28 12:40:21

+0

@CathG谢谢,更正名称为mynames。 is.list(mynames)返回FALSE,但即使我做了“mynames <-as.list(mynames)”,然后是“lapply(mynames,nrow)”,仍然对所有元素返回NULL。 – PedroA 2014-10-28 12:45:29

+0

我并不感到惊讶。你最好使用sapply,因为mynames是一个向量,但无论如何,mynames是data.frame名称,而不是data.frames,所以它们没有行... – Cath 2014-10-28 12:48:20

回答

2

对于第一种方法,尝试

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

有什么办法可以迭代几个nameoffile?因为我可以有几个。 – PedroA 2014-10-28 12:48:21

+0

它确实给你的行数为每个文件的名称是mynames或我误解你的问题? – Cath 2014-10-28 12:50:10

+1

它呢!完善! – PedroA 2014-10-28 12:51:07

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[[.]]))