-2

これは簡単な質問です。さまざまなディレクトリに多数の出力があり、それらをすべてマージしたいと考えています。ただし、これを少し混乱させる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 列を 1 つから保持し (これらをマージし続けるのではなく)、ファイルごとに異なる最後の 3 列をマージします。ただし、これらの 3 つの列にはすべて同じラベルが付けられているため、どのファミリ ファイルから来たものかを示すために何らかのラベルを付けることができるかどうか疑問に思っていました。

したがって、私のファイルには次の見出しがあります。

rs MID DID PID mom dad rec dom

「rs」から「DID」までの列は、各ファミリー番号で同じです (すべてのファミリー 1 ファイルで同じ、すべてのファミリー 3 ファイルで同じなど) が、「PID」、「お母さん」、「お父さん」、上記のすべてのファイル間で異なる「rec」列と「dom」列)

私はこれを理解しようとさえしていません。list.files と lapply と scan を見てきましたが、これを行うたびに混乱しています。

私はRが苦手なので(以前の投稿から明らかです)、どんな助けでも大歓迎です。

ありがとう

編集:

コドレミファのおかげで、以下のコードができました。エラーはありませんが、ファイルが生成されているデータはありません...簡単なことだと確信しています:

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つの列をマージし続けたくはありませんが、これらを1つから保持し、ファイルごとに異なる列をマージします。

4

1 に答える 1

0

このコードは、同じ姓のファイルをすべて読み取り、それらを 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)
  }
}

patterntomatch には、「family1」、「family2」などが含まれます。i のループは、ファイル名でこれらの各文字列を探します。パターンに一致する複数のファイルが見つかった場合、j のループはそれらを 1 つずつ読み取り、それらをマージしてマスターファイル化し、別のテーブルとして書き出します。

私はあなたのマージロジックを明確に理解していないため、コメントされた 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 に答える