我想使用以下方法将几个文件合并在一起:
do.call("cbind",lapply(sample_list, FUN=function(files){read.table(files, header=TRUE, sep="\t", stringsAsFactors=FALSE)}))
但是,我的sample_list文件(例如,1c.QC.dat)位于不同的目录中。但目录遵循相同的模式:
/home/Project1/Files/Sample_*/*.QC.dat
其中*是样本ID。
有没有办法轻松列出这些文件?
答案 0 :(得分:2)
让我们先选择我们的Sample_*
目录。
main_dir <- '/home/Project1/Files/'
directories <- list.files(main_dir, pattern = '^Sample_')
directories <- Filter(function(x) file.info(file.path(main_dir, x))$isdir, directories)
我们现在有一个以Sample_
开头的目录字符向量。现在我们可以读入data.frames:
dfs <- lapply(directories, function(subdir) {
files <- list.files(path <- file.path(main_dir, subdir), pattern = '\\.QC\\.dat$')
subdfs <- lapply(files, function(filename)
read.table(file.path(path, filename), header=TRUE, sep="\t", stringsAsFactors=FALSE)
)
do.call(rbind, subdfs)
})
最后,我们将它们绑定到一个巨大的数据帧中:
dfs <- do.call(rbind, dfs) # Notice we used the same trick twice
更短但更聪明的选择是使用recursive = TRUE
上的list.files
参数:
dfs <- do.call(rbind, lapply(
list.files(path <- '/home/Project1/Files/',
pattern = '^Sample_.*\\.QC\\.dat$', recursive = TRUE),
function(filename)
read.table(file.path(path, filename), header=TRUE, sep="\t", stringsAsFactors=FALSE)
))