-2

这是一个简单的问题。我在不同的目录中有许多输出,我想将它们全部合并。但是,我有两个担忧,这让我有点困惑:

1)我想建立一个循环。从我的问题来看:(如何遍历不同目录中的文件 [R])我有很多不同家庭 ID 下的文件。现在我有了这些不同 ID 的输出文件,我想将具有相同系列编号的文件合并在一起 - 例如将所有系列 1 文件(1a、1b、1c)合并在一起,将系列 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

我想将所有家庭 1 文件合并在一起,家庭 3 一起等等。

2) 每个文件中都有一些重复的列名。所有文件都有相同的标题(大多数都有),所以我想保留前 5 列(而不是继续合并这些)并合并每个文件不同的最后三个。但是,对于这三列,因为它们都标记相同,我想知道是否可以以某种方式标记它们以指示其来自哪个系列文件 - 也就是说,在合并之前在这三个列标题之后添加前缀系列字母。

所以我的文件有以下标题:

rs MID DID PID mom dad rec dom

列“rs”直到“DID”在每个家庭编号中都是相同的(在所有家庭 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

如上所述 - 我想合并所有具有相同系列编号的文件 - 例如将所有系列 1 文件(1a、1b、1c)合并在一起,将系列 3 文件合并在一起等。

此外,每个系列的每个文件中的前 9 列都是相同的 - 但最后 4 列不同。鉴于此 - 我不想继续合并这 9 列,而是将它们保留在一个列中并合并每个文件不同的列。

4

1 回答 1

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)
  }
}
于 2013-10-04T19:05:37.687 回答