我有大约三十个文件夹,每个文件夹中有许多文件,每个文件都包含不同信息的矩阵。我需要能够导入这些文件,以便我可以绘制矩阵的图像。我知道如何绘制图像,但我不知道如何获取所有文件。有没有办法遍历每个文件夹并从每个文件夹中获取我需要的单个文件?这是每年的气象数据。所以我拥有的是年度文件夹,每个文件夹都包含相同的变量。我需要一个循环,可以从 2005 文件夹中提取温度文件,然后从 2006 文件夹中提取温度文件,依此类推。这可以通过 for 循环或应用来完成吗?
问问题
198 次
3 回答
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
to 循环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 个矩阵中的每一个。
于 2013-04-17T04:11:23.590 回答
2
在窗户上:
假设您有年度文件夹,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)
}
于 2013-04-17T04:12:09.820 回答
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"
于 2013-04-17T04:44:31.313 回答