2014-10-09 86 views
0

我已經看到了其他一些帖子,他們建議將數據框加載到列表中,但是他們從未解釋過什麼是可接受的方式來命名動態生成的數據框。動態生成並命名數據框

我已經拿出了下面的代碼,我想知道這是否是一個很好的方法,或者如果我將來遇到問題?

感謝,

#create the data frames from all csv files into a list 
dfs <- lapply(list.files(pattern="*.csv"),read.csv) 

#Give them the correct names 
names(dfs) <- regmatches(list.files(pattern="*.csv"),regexpr("^[[:alpha:]]+", list.files(pattern="*.csv"))) 

另外,我可以爲它們命名,並在同一時間創造呢?我不想冒着在第二次調用時list.files以不同順序返回的風險,並且我在數據框上輸入了錯誤的名稱。

+0

我想這和它的工作很好,除了以數字開始任何的.csv名。 – Stu 2014-10-09 17:40:39

+0

你是對的,我應該使用一個更強大的正則表達式來查找文件名末尾的.csv。除此之外,它是否強健?這是對的嗎?它是優雅的嗎?是否會導致問題的道路? – variable 2014-10-09 17:42:52

+0

只有在文件被添加,刪除或修改時纔會發生不同的順序。您可以簡單地將'list.files'的返回值存儲在(臨時)變量中。 – Roland 2014-10-09 17:43:22

回答

5

Map函數將更好地自動命名元素。

dfs <- Map(read.csv, list.files(pattern="*.csv")) 

然後,您可以在列表生成後進一步編輯該列表的names()。或者,你可以保存文件名矢量,而不是調用list.files()多次和使用setNames馬上

#create the data frames from all csv files into a list 
csvfiles <- list.files(pattern="*.csv") 
dfs <- setNames(lapply(csvfiles, read.csv), 
    regmatches(csvfiles,regexpr("^[[:alpha:]]+", csvfiles)) 
) 
+0

因此,第二種方法與我的非常相似,並結合了Roland的建議,但它使用setnames()而不是'names()< - '對嗎?哦,它也創建和命名一步!我喜歡它,謝謝。 – variable 2014-10-09 17:57:14

+0

此外,如果有人想要改善它,因爲Stu建議,我正在玩正則表達式,像這樣:regmatches(list.files(pattern =「*。csv」),regexpr(「[[:punct:]] csv $ 「,list.files(pattern =」*。csv「)),invert = T)。唯一的問題是我每個名字都有兩個字符,右邊是空白字符。 – variable 2014-10-09 18:01:07

+0

你的正則表達式的實際目標是什麼。這將有助於提供樣本輸入和期望的輸出。似乎至少在當前版本中,只是使用'gsub'去除非字母數字值會更簡單。也許你應該問一個新的問題,只關注你的名字清理問題。 – MrFlick 2014-10-09 18:17:34