У меня около тридцати папок, и в каждой папке есть несколько файлов, каждая из которых содержит матрицу различной информации. Мне нужно иметь возможность импортировать эти файлы, чтобы я мог сделать графический график матриц. Я знаю, как сделать графический сюжет, но я не знаю, как получить все файлы. Есть ли способ перебирать каждую папку и захватывать отдельные файлы, которые мне нужны от каждого? Это ежегодные метеорологические данные. Итак, у меня есть ежегодные папки и каждая папка содержит одни и те же переменные. Мне нужен цикл, который может вытащить файл температуры из папки 2005 года, затем вытащить файл температуры из папки 2006 года и так далее. Можно ли это сделать с помощью цикла for или применить?Импорт нескольких файлов
ответ
Посмотрите на ?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-х матриц в каждый из двух списков.
Если каждый файл представляет собой матрицу размером 10 на 10, как бы я помещал их в массив. Используя ваш пример, как бы я поместил каждый файл1.csv в матрицу. Это отлично поработало, но в нем перечислены каждая отдельная матрица. – user2113499
@ user2113499 можете ли вы начать новый вопрос для этого, пожалуйста? –
http://stackoverflow.com/questions/16180583/importing-mustiple-matricies-to-one-array-in-r Это новый вопрос. – user2113499
На окнах:
Если у вас есть ежегодные папки в 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)
}
Для удобства чтения вы можете использовать '/' вместо '\\\'. –
Вы имеете в виду внутри 'setwd()'? – Nishanth
Я имею в виду везде (для путей к каталогам в Windows). –
Если вы хотите иметь все чтения файлов в виде кадров данных в поток вы могли бы сделать что-то подобное. Я сделал временный справочник под названием 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, прилагая год каждого на конец данных е 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"
Можете ли вы показать формат имен папок и файлов в них? (Это что-то вроде 'temp2005',' temp2006' или что-то еще?) –
Папки 2005152, 2005182, 2005312, 2006152, 2006182 и т. Д. Это папки, которые представляют собой три месяца в году. Необходимые файлы в каждой папке называются Cirrus_Reflective-_Mean_Daily.mat Я знаю, как импортировать файлы .mat – user2113499