0

Perl スクリプトの 1 つを R スクリプトに変換しようとしています。Rに次のようなデータフレームがあります(列名は無視してください)-

CHR 開始終了タイプ
chr1 945493 945593 通常
chr1 945593 947374 通常
chr1 947374 947474 ノーマル
chr1 947474 947574 ゲイン
chr1 947574 947674 ゲイン
chr1 947674 960364 ゲイン
chr1 960364 960464 通常
chr22 17290491 17290591 ノーマル
chr22 17290591 17290691 ノーマル
chr22 17290691 17290791 ゲイン
chr22 17290791 17292513 ゲイン
chr22 17292513 17292613 ゲイン
chr22 17292613 17292713 ゲイン
chr22 17292713 17293046 ゲイン
chr22 17293346 17298475 ゲイン
chr22 17298475 17298575 ゲイン
chr22 17298575 17298675 ノーマル
chr22 17298675 17303632 通常
chr22 17303632 17303732 損失
chr22 17303732 17303832 ノーマル
chrX 154162621 154181221 通常
chrX 154181221 154181321 通常
chrX 154181321 154181421 損失
chrX 154181421 154181521 損失
chrX 154181521 154181621 損失
chrX 154181621 154181721 損失
chrX 154181721 154216867 損失
chrX 154216867 154216967 通常
chrX 154216967 154217067 通常
chrX 154217067 154217167 通常

「CHR」列と「TYPE」列に同じ値を持つ連続する行が少なくとも 5 行ある場合は、それらすべての行を 1 つの行に結合して、START 列が最初の行の値を持ち、END 列が最後の行の値を持つようにします。 「利益」または「損失」タイプの行を返すだけです。したがって、望ましい出力は次のとおりです。

chr22 17290691 17298575 ゲイン
chrX 154181321 154216867 損失

私が今していることは次のとおりです。

  1. 「write.table」でデータフレームを保存します。
  2. 次の perl スクリプトを使用します。

      open $first, "<",$ARGV[0] or die "Unable to open input file: $!";
      my $count=1;
      $_ = <$first>;
      chomp;
      my ($p_key, $p_col1, $p_col2,$p_cnv) = split;
    
      while(<$first>) {
          chomp;
          my ($key, $col1, $col2,$cnv) = split;
          if ($key eq $p_key and $cnv eq  $p_cnv) {
            $p_col2 = $col2;
            $count++;
    
          } elsif ($count > 4){
    
    
             print $p_key,"\t", $p_col1,"\t", $p_col2,"\t", $p_cnv,"\n" if($p_cnv eq "gain" or $p_cnv eq "loss");
             ($p_key, $p_col1, $p_col2, $p_cnv) = ($key, $col1, $col2, $cnv);
             $count=1;
            }
    
           else { 
    
        ($p_key, $p_col1, $p_col2, $p_cnv) = ($key, $col1, $col2, $cnv);
            $count=1;
           }
    }
    

これは、最初にデータフレームを保存してから Perl スクリプトを使用するための追加の手順だと思います。誰かがRでこれを行う簡単な方法を提案してもらえますか?パッケージやその他のトリックはありますか?

4

3 に答える 3

2

これらの線に沿って何か?

library(plyr)
ddply(x[x$TYPE %in% c("gain", "loss"), ], 
      .(CHR, TYPE), 
      function(z){if(nrow(z) < 5) NULL else z[range(seq_len(nrow(z))), ]}
      )

    CHR     START       END TYPE
1 chr22  17290691  17290791 gain
2 chr22  17298475  17298575 gain
3  chrX 154181321 154181421 loss
4  chrX 154181721 154216867 loss
于 2012-09-20T13:16:31.567 に答える
1

1つの染色体内にTYPEの代替値が介在している場合は、シーケンスを中断する(つまり、それらを別個のものと見なす)必要があるのではないかと心配していました。あなたはそれをそのように具体的に述べていませんでしたが、生物学はその追加の要件を正当化すると思います。したがって、別の変数を作成する必要があります。cdat反対のアドバイスがない限り、データフレームの名前はと仮定します。これは、TYPEの連続実行内を調べ、テストを適用し、最初にCHRとSTARTをバインドし、最後の要素にENDとTYPEをバインドします。

cdat$conseq <-cumsum(c(1, cdat$TYPE[-1] != cdat$TYPE[-length(cdat$TYPE)] ) )
do.call( rbind, 
    by(cdat, list(cdat$CHR, cdat$conseq), 
         function(df)
            if( NROW(df) >=5 & df$TYPE[1] %in% c("gain", "loss") ) {
                cbind(df[1, c("CHR", "START")] , df[NROW(df), c("END", "TYPE")] ) 
                } else{NULL} ) )
     CHR     START       END TYPE
10 chr22  17290691  17298575 gain
23  chrX 154181321 154216867 loss

conseqベクトルは、次のTYPE値を前の値と比較し、cumsum()-その全長に沿った新しい値の出現によって構築されます。これらの変数は1要素短いためです。1は、データフレームと整列させるために、最初にプレースホルダーとして追加されます。

于 2012-09-20T14:40:46.210 に答える
0

SQL に精通していて、データ フレームの多くの操作を行いたい場合、別のオプションはsqldfライブラリです。これにより、R データフレームで SQL クエリを実行できます。このような操作が非常に簡単になります。

R-Perl インターフェースもあり、これにより、既存の Perl コードを保持し、その結果で R 処理を行うことができます。

于 2012-09-20T13:21:55.420 に答える