2017-10-01 9 views
0

다른 코드로 몇 시간 동안 실험 한 후에 도움을 요청합니다. 다섯 개의 하위 폴더가있는 폴더가 있습니다. 각 하위 폴더에는 세 개의 CSV 파일이 있습니다. 나는 각 하위 폴더에있는 세 개의 CSV 파일을 묶어서 동일한 하위 폴더에 결과를 출력하고 각 하위 폴더에 대해 동일한 작업을 수행하려고합니다. 따라서 원본 15 개의 CSV 파일 외에 5 개의 하위 폴더에 5 개의 파일이 결합됩니다. 도와 주셔서 감사합니다. 다음 코드 줄을 함께 넣었지만 성공하지 못했습니다.CSV 파일을 바인딩하고 결과를 동일한 하위 폴더 및 루프로 출력

#Folder containing sub-folders 
parent.folder <- "path" 

# Sub-folders 
sub.folders <- list.dirs(parent.folder, recursive=TRUE)[-1] 

# List files in all subfolders 
files <- sapply(sub.folders, list.files, all.files = F, full.names = T, recursive=TRUE) 


# Make a list of lists 
mydata <- lapply(files, function(x) read.csv(x, header = T)[,14:17]) #list of lists, each has 4 variables 


for (r in 1:length(mydata)){ 
fileatt <- paste("path","new_file",r,".csv",sep="") 
write.table(mydata[r],fileatt, row.name=F, col.name=c("a","b","c","d"), quote=F,sep=",") 
} 

답변

1

이 방법을 사용하면됩니다. 다음은 귀하가 선택한 topdir에 세 개의 하위 폴더를 생성하는 완전한 예제입니다. 각 하위 폴더에는 두 개의 열과 세 개의 줄이있는 두 개의 텍스트 파일이 채워집니다.

다음 단계는 이러한 하위 폴더를 찾아 파일을 가져 와서 하위 폴더로 병합하고 최상위 디렉토리에 작성하는 것입니다.

## data generation 

# top folder 
topdir <- "test" 
dir.create(topdir) 

# create subfolders 
subdirs <- c("sub1", "sub2", "sub3") 
sapply(subdirs, FUN = function(x, topdir) dir.create(file.path(topdir, x)), topdir = topdir) 

finddirs <- list.dirs(topdir, recursive = FALSE) 

sapply(finddirs, FUN = function(x) { 
    replicate(3, { 
    fn <- sample(letters, 5, replace = TRUE) 
    fn <- paste(paste(fn, collapse = ""), ".txt", sep = "") 

    xy <- data.frame(a = 1:3, b = runif(3)) 

    write.table(xy, file = file.path(x, fn), row.names = FALSE, sep = "\t") 
    }) 
}) 

## merging of files 

# find subfolders 
find.dirs <- list.dirs(topdir, recursive = FALSE) 

# find files in dirs 
files.in.dirs <- sapply(find.dirs, FUN = function(x) list.files(x, full.names = TRUE), simplify = FALSE) 

# read files and merge into one data.frame 
merged.by.subdir <- sapply(files.in.dirs, FUN = function(x) { 
    xy <- sapply(x, read.table, sep = "\t", simplify = FALSE, header = TRUE) 
    as.data.frame(do.call(rbind, xy)) 
}, simplify = FALSE) 

# create main filenames per subfolder 
bn <- basename(names(merged.by.subdir)) 
bn <- paste(bn, ".txt", sep = "") 
bn <- file.path(topdir, bn) 

# write data into folder 
mapply(as.list(bn), merged.by.subdir, FUN = function(x, y) { 
    write.table(y, file = x, row.names = FALSE) 
}) 
+0

코드가 훌륭합니다. Roman Lustrik에게 감사드립니다. csv 파일을 읽고 cbind를 사용하여 파일을 가로로 바인딩하기 위해 약간 수정했습니다. rbind 대신 cbind를 사용할 때 해결해야 할 두 가지 문제가 있습니다. (1) 열 이름 앞에 파일 경로 이름이 붙습니다. (2) 하위 폴더의 각 파일에서 특정 열 [, 14 : 17] 만 가져옵니다. 다시 한 번 감사드립니다! – abenol