【问题标题】:Merging different files in different directories [R]合并不同目录中的不同文件 [R]
【发布时间】: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) 部分?
  • 您能否发布您的目录和文件示例并解释您想要实现的具体目标?

标签: r merge


【解决方案1】:

这段代码应该可以读取所有相同的姓氏文件并将它们合并为一个 -

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)
  }
}

【讨论】:

  • 我有一个后续问题(请参阅原始帖子)......这可能是我试图让这个问题变得更复杂并且错过了一个基本的事情。
  • 谢谢...这会发生吗?如果没有,这可能是我在代码中所做的。
  • 很抱歉,我认为您应该尝试自己调试代码。人们回答问题的目的是提供一般性质的帮助,而不是为他人编写代码。我想我已经为您提供了足够多的指导,让您能够弄清楚解决方案可能是什么样子以及您需要做什么。
  • 是的……但我不是要你写我的代码……只是问我是否解释了你给出的内容是准确的。如果是,那么我需要更改您的代码以适合我想要的。如果不是,那么我已经做了一些我需要改变的事情。因为试图假设你给出的东西做了某件事而实际上并没有做到——有点疯狂(尤其是对于 R 和调试的新手)。只是要求一些指示,以便我能够理解这一点,以便自己解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 2016-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多