2014-10-28 135 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[[.]]))