2013-04-17 4 views
0

나는 약 30 개의 폴더가 있고 각 폴더에는 각각 다른 정보가 들어있는 여러 파일이 있습니다. 그 파일을 가져올 수 있어야 매트릭스의 이미지 플롯을 할 수 있습니다. 이미지 줄거리를하는 방법을 알고 있지만 모든 파일을 가져 오는 방법을 모르겠습니다. 각 폴더를 반복하고 각 파일에서 필요한 개별 파일을 가져 오는 방법이 있습니까? 이것은 매년 기상 데이터입니다. 그래서 내가 가지고있는 것은 매년 폴더이고 각 폴더에는 같은 변수가 들어 있습니다. 2005 폴더에서 온도 파일을 가져 와서 2006 폴더에서 온도 파일을 가져올 수있는 루프가 필요합니다. for 루프 나 적용 할 수 있습니까?여러 파일 가져 오기

+0

폴더 및 파일 이름 형식을 표시 할 수 있습니까? (그들은 'temp2005','temp2006' 등과 같은 것입니까?) –

+0

폴더 2005152, 2005182, 2005312, 2006152, 2006182 등등이 있습니다. 3 개월을 나타내는 폴더입니다. 각 폴더에 필요한 파일의 제목은 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을 반복하여 플로팅 할 수 있습니다.

참고 재현 할만한 예제가 없으므로 위의 테스트를 모두 수행하지 않았습니다. 일부 파일과 폴더를 신속하게 테스트하여 테스트 할 수 있습니다.

> 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()을 얻는 방법 일,하지만하지 않은 : 여기

> 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가 지금과 같은 설정의 이런 종류의 예입니다

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

은 각각의 3 개의 매트릭스를 두 목록 각각.

창에
+0

각 파일이 10x10 매트릭스 인 경우 어떻게 배열에 넣을 수 있습니까? 귀하의 예제를 사용하여 각 file1.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)) 

... 새로운 R 세션에서

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

, 나는 디렉토리의 tmp에 가서 바람을 가지고있는 모든 파일을 가지고 모든 디렉토리에서 이름이

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

는 그럼 난 데이터 (F)의 끝 부분에 각각의 연도를 추가,이 파일을 반복하고 현재 R 세션에로드 할 lapply을 사용 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"