这是一个简单的问题。我在不同的目录中有很多输出,我想将它们全部合并。但是,我有两个问题让我对此感到有些困惑:
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个列(不保持合并这些)并合并每个文件不同的最后三个。但是,有了这三个列,因为它们都标记相同,我想知道是否有可能以某种方式标记它们来指示它来自哪个族文件 - 也就是说,在合并之前在这三个列标题之后添加前缀Family字母。< / p>
所以我的文件有以下标题:
rs MID DID PID mom dad rec dom
直到“DID”的列“rs”在每个族编号中是相同的(在所有族1文件中相同,在所有族3文件中都相同)但是它的“PID”,“妈妈”,“爸爸“,”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列但保留这些列并合并每个文件不同的列。
答案 0 :(得分:0)
此代码应该可以读取所有相同的系列名称文件并将它们合并为一个 -
library(data.table)
patternstomatch <- paste("family",1:10,sep = "")
for (i in patternstomatch)
{
filestorbind <- list.files(pattern = i)
if( length(filestorbind ) > 1)
{
for (j in filestorbind )
{
#tempfile <- read.table(j)
#if ( exists(masterfile) )
{
#masterfile <- merge(masterfile, tempfile, by = c())
} else {
#masterfile <- tempfile
}
}
#write.table(masterfile)
}
}
patternstomatch将包含“family1”,“family2”等.i上的循环将在文件名中查找每个字符串。如果找到与模式匹配的多个文件,则j上的循环将逐个读取它们,并继续将它们合并为masterfile并将其作为另一个表写出来。
我不清楚你的合并逻辑是什么,这就是为什么我在j上留下循环评论,但我认为你应该能够弄明白。
OP编辑后的编辑 -
library(data.table)
setwd('/home/smith/Project001')
patternstomatch <- paste("family",1:9,sep = "")
for (i in patternstomatch)
{
allfiles <- list.files(recursive = TRUE)
filestorbind <- grep(x = allfiles, pattern = i, value = TRUE)
if( length(filestorbind ) > 1)
{
for (j in filestorbind )
{
#tempfile <- read.table(j)
#if ( exists(masterfile) )
{
#masterfile <- merge(masterfile, tempfile, by = c())
} else {
#masterfile <- tempfile
}
}
#write.table(masterfile)
}
}