导入多个文件

时间:2013-04-17 03:52:12

标签: r

我有大约30个文件夹,每个文件夹中有许多文件,每个文件都包含不同信息的矩阵。我需要能够导入这些文件,以便我可以对矩阵进行图像绘制。我知道如何做图像情节,但我不知道如何获取所有文件。有没有办法遍历每个文件夹并从每个文件夹中获取我需要的各个文件?这是每年的气象数据。所以我所拥有的是年度文件夹,每个文件夹包含相同的变量。我需要一个循环,可以从2005文件夹中提取温度文件,然后从2006文件夹中提取温度文件,依此类推。这可以通过for循环完成还是应用?

3 个答案:

答案 0 :(得分: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个矩阵中的每一个。

答案 1 :(得分: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)
}

答案 2 :(得分: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会话中,将每个文件的年份追加到数据框对象的末尾。

> 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"