2017-10-01 57 views
0

我在用几个小时的不同代码进行实验后询问了帮助。我有一个文件夹,有五个子文件夹。每个子文件夹都有三个csv文件。我想要将这三个csv文件绑定到每个子文件夹中,并将结果输出到同一个子文件夹中,并对每个子文件夹执行相同的操作。因此,除了原始的15个csv文件外,我将在这五个子文件夹中有五个组合文件。我感谢您的帮助。我把下面的代码行放在一起,但没有成功绑定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

代码的伟大工程,非常感谢罗马Lustrik。我修改了一下,读取csv文件并使用cbind水平绑定它们。在使用cbind而不是rbind时,我有两个问题需要解决:(1)列名以文件路径名作为前缀; (2)仅从子文件夹中的每个文件导入某些列[,14:17]。再次感谢! – abenol

相关问题