合并不同目录中的不同文件[R]

时间:2013-10-04 14:32:17

标签: r merge

这是一个简单的问题。我在不同的目录中有很多输出,我想将它们全部合并。但是,我有两个问题让我对此感到有些困惑:

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列但保留这些列并合并每个文件不同的列。

1 个答案:

答案 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)
  }
}
相关问题