2015-05-20 56 views
0

我通過搜索工作目錄中找到的文件名列表。我想要創建一個數據框,其中可以選擇多個元素或多個數據框。要選擇一個數據框的一部分或從多個數據框中選擇,我想用相關文件名的一部分來命名它們。R:基於進口文件名指定變量名

目前,我設置使用list.filesfilenames和設置使用lapply數據幀與read.csv

filenames = list.files(recursive=TRUE,pattern="*dat.csv",full.names=FALSE) 
data = lapply(filenames,function(i){ 
    read.csv(i,stringsAsFactors=FALSE) 
}) 

有人能向我解釋去了解這個數據導入和名稱分配的最佳方式?

+1

如果運行'數據=地圖(函數(I {read.csv(I,stringsAsFactors = FALSE)},文件名)',你會得到的載體命名列表。這是你所需要的?你能關於到底想要的輸出是什麼? – MrFlick

+0

我想將它們分配給部分數據之前刪除的文件名部分更精確。你的建議是什麼在起作用,反而使得調用數據更復雜,比我要怎樣做。例如,我想將file1分配給一個向量,但是使用你的建議,這個向量被命名爲'folder/file1.csv'。似乎我需要在使用read.csv導入之後分配向量名稱,除非你有任何其他建議? – Eric

回答

1

存儲,這將是與描述原始文件中的列單,合併後的數據幀的一個好方法,讓我們說type

data_frames = lapply(filenames,function(i){ 
    ret <- read.csv(i,stringsAsFactors=FALSE) 
    ret$type <- gsub("dat.csv$", "", i) 
    ret 
}) 
data = do.call(rbind, data_frames) 

或更短,與plyr:

library(plyr) 
data = ldply(filenames, read.csv, stringsAsFactors = FALSE, .id = "type") 
data$type <- gsub("dat.csv$", "", data$type) 

這樣你可以提取你想要的任何子集:

# to get all lines from, say, the AAAdat.csv file 
subset(data, type == "AAA") 

可能店每個數據集與像AAA名稱的個體變量,但你不應該,因爲it's a bad idea to use your variable names to store information

(注意,這裏假設你的數據集分享最,或至少一些,列。如果他們有完全不同的結構,這是不恰當的做法)。

+0

這種方法似乎讓我在處理數據時更加困難,因爲每個數據文件都沒有放入它自己的向量中,我會更容易知道文件名的順序並調用對應的用數據[1]或我正在查找的任何一個數據。 – Eric

+0

@Eric你可以用'data = lapply(文件名,read.csv,stringsAsFactors = FALSE)'做到這一點。但我確實推薦「作爲組合數據框架」方法。當與諸如dplyr,ggplot2和通用[tidy數據框架](http://www.jstatsoft.org/v59/i10/paper)等工具結合使用時,您可以做更多更強大的事情。 (例如,在同一時間進行的所有數據集的操作是容易的,因爲正密謀他們都在同一張圖的次要情節) –

+0

說我希望有子集「AAA」,「BBB」和「CCC」的所有繪製在一個陰謀。我擁有的數據是20列(加上你的解決方案添加的第21類列)。我想繪製每個不同子集的第1和第7列。一個這種情節,我希望每個子集有不同的點類型或線類型,具體取決於我構建的具體情節。以前,我使用了一個for循環,它看起來像'j = 1for(i在c(「AAA」,「BBB」,「CCC」)){points(data [[i]] [,1],data [[i ]] [,7],pch = j,lwd = 2)j = j + 1}'。這是一個向量,每個數據集可以用'data [[1]] [,1]'調用。 – Eric