【发布时间】:2013-10-04 14:32:16
【问题描述】:
这是一个简单的问题。我在不同的目录中有许多输出,我想将它们全部合并。但是,我有两个担忧,这让我有点困惑:
1) 我想设置一个循环。从我的问题来看:(How to loop over files in different directories [R])我在不同的家庭 ID 下有很多文件。现在我有了这些不同 ID 的输出文件,我想将具有相同家庭编号的文件合并在一起 - 例如将所有 Family 1 文件(1a、1b、1c)合并在一起,将 Family 3 文件合并在一起等。
所以我的文件是这样设置的:
/home/smith/Family1a/Family1a.txt
/home/smith/Family1a/Family1b.txt
/home/smith/Family1a/Family1c.txt
/home/smith/Family1a/Family2.txt
/home/smith/Family1a/Family3a.txt
/home/smith/Family1a/Family3b.txt etc
我想将所有 Family 1 文件合并在一起,Family 3 一起合并等等。
2) 每个文件中都有一些重复的列名。所有文件都有相同的标题(大多数都有),所以我想保留前 5 列(而不是继续合并这些),并合并每个文件不同的后三列。但是,对于这三列,因为它们都标记相同,我想知道是否可以以某种方式标记它们以指示其来自哪个系列文件 - 也就是说,在合并之前在这三个列标题之后添加前缀系列字母。
所以我的文件有以下标题:
rs MID DID PID mom dad rec dom
“rs”直到“DID”列在每个家庭编号中都是相同的(在所有家庭 1 文件中相同,在所有家庭 3 文件中相同等),但它是“PID”、“妈妈”、“ dad”、“rec”和“dom”列在上面列出的所有文件之间有所不同)
我什至没有试图弄清楚这一点。我查看了 list.files 和 lapply 并扫描,但每次我这样做时都会变得更加困惑。
我不擅长 R(从我之前的帖子中可以清楚地看出),因此我们将不胜感激。
谢谢
编辑:
感谢 Codoremifa - 我有以下代码。没有错误,但没有数据正在生成文件......我相信这是一件容易的事:
library(data.table)
patternstomatch <- paste("Family",1:11,sep = "")
for (i in patternstomatch)
{
filestorbind <-list.files(paste("/home/smith/",patternstomatch))
if(length(filestorbind) > 1)
{
for (j in filestorbind)
{
tempfile <- read.table(j)
if (exists(paste("/home/smith/",patternstomatch,"a/",patternstomatch,"a.txt")))
{
masterfile <- merge(masterfile, tempfile, by = c(1:9))
} else {
masterfile <- tempfile
}
}
write.table(masterfile,paste("/home/smith/",patternstomatch,".txt"),sep="\t",row.names=F,col.names=F,quote=F)
}
}
我觉得这可能与这部分有关:
filestorbind <-list.files(paste("/home/smith/",patternstomatch))
但不确定。
编辑 2:
这是我的完整目录路径,包括我要合并的特定文件的名称:
/home/smith/Project001/Family1a/Project001_Family1a_vcf_denovo_rec.txt
/home/smith/Project001/Family1b/Project001_Family1b_vcf_denovo_rec.txt
/home/smith/Project001/Family1c/Project001_Family1c_vcf_denovo_rec.txt
/home/smith/Project001/Family2/Project001_Family2_vcf_denovo_rec.txt
/home/smith/Project001/Family3a/Project001_Family3a_vcf_denovo_rec.txt
/home/smith/Project001/Family3b/Project001_Family3b_vcf_denovo_rec.txt
如上所述 - 我想合并所有具有相同家庭编号的文件 - 例如将所有 Family 1 文件(1a、1b、1c)合并在一起,将 Family 3 文件合并在一起等。
此外,每个系列的每个文件中的前 9 列都是相同的 - 但最后 4 列不同。鉴于此 - 我不想继续合并这 9 列,而是将它们保留在一个列中并合并每个文件不同的列。
【问题讨论】:
-
paste("/home/smith/",patternstomatch,".txt"),您需要sep = ""才能正确生成路径。 -
我实际上认为这是我的问题......我在我的示例中简化了很多文件路径。鉴于这些目录中有多个文件(具有不同名称),实际文件路径更加复杂,但我只想使用每个文件夹中的一个特定文件来合并在一起。例如:我要使用的文件具有类似的目录路径:“/home/smith/”,patternstomatch,“/”,Project001_”,patternstomatch,”_vcf_denovo_rec.txt”我确定它不是因为这个能够找到合适的文件来打开并合并在一起。我可以假设这个吗?
-
list.files()函数有一个返回完整路径的递归参数。您可以尝试将list.files(recursive = TRUE)的结果存储到一个变量中,然后在其上使用grep。 list.files 中的模式参数仅适用于文件名,而出于某种原因不适用于完整路径。这有帮助吗? -
我可能想多了......但这会改变它下面的循环,它试图在合并之前找到某个文件是否存在?我在这里很困惑,但不禁认为这可能不适用于 if(length(filestorbind) >1) 部分?
-
您能否发布您的目录和文件示例并解释您想要实现的具体目标?