2013-04-17 156 views
0

我有大約三十個文件夾,每個文件夾中有許多文件,每個文件都包含不同信息的矩陣。我需要能夠導入這些文件,所以我可以做一個矩陣的圖像圖。我知道如何做圖像繪圖,但我不知道如何獲取所有文件。有沒有辦法循環訪問每個文件夾,並從每個文件夾中獲取我需要的單個文件?這是每年的氣象數據。所以我擁有的是年度文件夾,每個文件夾都包含相同的變量。我需要一個可以從2005文件夾中提取溫度文件的循環,然後從2006文件夾中提取溫度文件等等。這可以通過for循環來完成還是應用?導入多個文件

+0

你可以顯示文件夾和文件名稱的格式嗎? (他們是否像'temp2005','temp2006'或其他什麼東西?) –

+0

文件夾2005152,2005182,2005312,2006152,2006182等等。他們是代表一年中三個月的文件夾。每個文件夾中需要的文件標題爲Cirrus_Reflective-_Mean_Daily.mat 我知道如何導入.mat文件 – user2113499

回答

2

?list.dirs和相關功能list.files(兩者以相同的幫助頁文檔)

首先列出目錄,如:

> (dirs <- list.dirs("~/foo", recursive = FALSE)) 
[1] "/home/gavin/foo/bar1" "/home/gavin/foo/bar2" 

然後遍歷這些,列出文件當前目錄並讀入列表中,例如不管是什麼功能

loadFiles <- function(dirs) { 
    fs <- list.files(dirs, full.names = TRUE, no.. = TRUE) 
    lapply(fs, read.table, ....) 
} 
fs <- lapply(dirs, loadFiles) 

替代read.table需要閱讀的文件,與其他參數替換....read.table(或相關的功能)。

然後,您可以使用rapply來循環fs來進行繪圖。

注意以上都沒有經過測試,因爲沒有可重複的例子,我可以快速將其放入幾個文件和文件夾中進行測試。

這裏是這種設置的一個例子

> list.dirs("~/foo", recursive = FALSE) 
[1] "/home/gavin/foo/bar1" "/home/gavin/foo/bar2" 
> list.files("~/foo/bar1") 
[1] "file1.csv" "file2.csv" "file3.csv" 
> list.files("~/foo/bar2") 
[1] "file1.csv" "file2.csv" "file3.csv" 

loadFiles <- function(dirs) { 
    fs <- list.files(dirs, full.names = TRUE, no.. = TRUE) 
    lapply(fs, function(x) data.matrix(read.csv(x, row.names = 1))) 
} 
fs <- lapply(list.dirs("~/foo", recursive = FALSE), loadFiles) 

fs現在看起來是這樣的:

> str(fs) 
List of 2 
$ :List of 3 
    ..$ : num [1:5, 1:5] -1.65 -2.47 1.27 0.14 -0.22 ... 
    .. ..- attr(*, "dimnames")=List of 2 
    .. .. ..$ : chr [1:5] "1" "2" "3" "4" ... 
    .. .. ..$ : chr [1:5] "V1" "V2" "V3" "V4" ... 
    ..$ : num [1:5, 1:5] 0.417 0.186 -2.452 -0.695 -1.216 ... 
    .. ..- attr(*, "dimnames")=List of 2 
    .. .. ..$ : chr [1:5] "1" "2" "3" "4" ... 
    .. .. ..$ : chr [1:5] "V1" "V2" "V3" "V4" ... 
    ..$ : num [1:5, 1:5] 1.41924 -1.96918 0.38819 -0.41437 0.00718 ... 
    .. ..- attr(*, "dimnames")=List of 2 
    .. .. ..$ : chr [1:5] "1" "2" "3" "4" ... 
    .. .. ..$ : chr [1:5] "V1" "V2" "V3" "V4" ... 
$ :List of 3 
    ..$ : num [1:5, 1:5] -1.791 0.805 0.302 -0.383 -0.793 ... 
    .. ..- attr(*, "dimnames")=List of 2 
    .. .. ..$ : chr [1:5] "1" "2" "3" "4" ... 
    .. .. ..$ : chr [1:5] "V1" "V2" "V3" "V4" ... 
    ..$ : num [1:5, 1:5] 0.305 0.353 -0.342 0.515 -0.375 ... 
    .. ..- attr(*, "dimnames")=List of 2 
    .. .. ..$ : chr [1:5] "1" "2" "3" "4" ... 
    .. .. ..$ : chr [1:5] "V1" "V2" "V3" "V4" ... 
    ..$ : num [1:5, 1:5] -0.634 -0.776 0.517 -0.845 0.83 ... 
    .. ..- attr(*, "dimnames")=List of 2 
    .. .. ..$ : chr [1:5] "1" "2" "3" "4" ... 
    .. .. ..$ : chr [1:5] "V1" "V2" "V3" "V4" ... 

我還沒有完全制定出如何讓rapply()在這裏工作,但

lapply(fs, function(x) lapply(x, image)) 

將繪製3個矩陣中的每一個兩個列表中的每一個。

+0

如果每個文件都是10乘10矩陣,我會如何將它們放入數組中。使用你的例子,我將如何將每個file1.csv放入一個矩陣中。這很好,但它列出了每個單獨的矩陣。 – user2113499

+0

@ user2113499你能爲此開始一個新的問題嗎? –

+0

http://stackoverflow.com/questions/16180583/importing-mustiple-matricies-to-one-array-in-r 這是新的問題所在。 – user2113499

2

在Windows上:

假設你有逐年文件夾D:/data,並且每個文件夾都有名字文件temperature.csv

# set the main working directory 
setwd("D:/data") 

# allocate a list for temperature matrices 
list.temp.matrix = vector("list",length(list.dirs(recursive=FALSE))) 

# iterate through each folder and load the file 
i <- 1 
for (dir.name in list.dirs(recursive=FALSE)) 
{ 
    file.name <- paste0(dir.name, "/temperature.csv") 
    temp.matrix <- as.matrix(read.csv(file.name)) 

    # update the list 
    list.temp.matrix[[i]] <- temp.matrix 
    i <- i + 1 

    # to avoid over-writing plots 
    x11()          
    image(temp.matrix) 
} 
+0

您可以使用'/'而不是'\\\'來提高可讀性。 –

+0

你的意思是在'setwd()'裏面? – Nishanth

+0

我的意思是無處不在(對於Windows上的目錄路徑)。 –

0

如果你正在尋找讓所有讀取數據幀到當前文件你可以做這樣的事情。我做了一個名爲temp的臨時目錄

> getwd() 
[1] "/Users/homedir/tmp" 

它有3個不同年份的數據目錄。

> dir() 
[1] "data2005" "data2006" "data2007" 

在這些是保存的一些文件(它們是相同的爲示例的目的。

> ddfwind <- data.frame(x=runif(10), y=runif(10)) 
> ddfsun <- data.frame(x=runif(10), y=runif(10)) 

這些文件保存的目錄設置的例子...

> lapply(dir(), function(x) { 
+  save(ddfwind, file=paste(x,"wind.dat",sep="/")) 
+  save(ddfsun,file=paste(x,"sun.dat",sep="/")) 
+ }) 

在一個新的R會話,我去tmp目錄,並得到了所有有風的文件從所有目錄的名字

> fn.windData <- dir(pattern="wind.dat$", recursive=TRUE) 

然後我用lapply通過這些文件進行迭代,並將它們加載到當前R對話,追加每一年到數據F結束rame對象。

> lapply(fn.windData, function(x) { 
+ L1 <- load(x) 
+ assign(paste0(L1, gsub("[a-z./]", "", x)), get(L1), envir=.GlobalEnv) 
+ }) 
> ls() 
[1] "ddfwind2005" "ddfwind2006" "ddfwind2007" "fn.windData"