2013-04-17 4 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, как бы я помещал их в массив. Используя ваш пример, как бы я поместил каждый файл1.csv в матрицу. Это отлично поработало, но в нем перечислены каждая отдельная матрица. – user2113499

+0

@ user2113499 можете ли вы начать новый вопрос для этого, пожалуйста? –

+0

http://stackoverflow.com/questions/16180583/importing-mustiple-matricies-to-one-array-in-r Это новый вопрос. – user2113499

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) 
} 
+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, прилагая год каждого на конец данных е 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"