2017-07-31 5 views
1

私は、特定の要素を順次合計しながら、マージしたい一連のデータフレームを持っています。背景のために、これらはアライメントに沿って遺伝子領域を参照するゲノム配列データのための個々のパーティションファイルです(文字列のセクションとして考える)。私はシーケンスアライメントを一緒にマージしたので、パーティションの相対位置を保持しながらパーティションファイルをマージする必要があります。個々のパーティションファイルの任意の数と長さに対応できるように、これをできるだけ一般的にするとよいでしょう。Rエレメントを順番に合計するデータフレームのマージ - トリッキー。

合流し、このような何かを動作させる必要を合計:

  1. 第2の列の要素は、前の行の第3列の要素を加えた一つです。
  2. 第3列:第1要素はn、第2要素は2n、第3要素は3nなどとなります。
  3. 新しくマージされたデータフレームでは、3番目の列の最初の要素は、その値(x)と前のデータフレーム(x +?n)の3番目の列の最後の要素を加算します。 xは、データフレームの終わりまたは新しいフレームがマージされるまで、各行のx +Δnに加算される。

単純な例をよく説明します。ここで

はリージョン1のデータフレームである:

    V1 V2 V3 
Region_1_Partition_1  1 500 
Region_1_Partition_2 501 1000 
Region_1_Partition_3 1001 1500 

そして、ここではリージョン2です:

    V1 V2 V3 
Region_1_Partition_1  1 500 
Region_1_Partition_2 501 1000 
Region_1_Partition_3 1001 1500 
Region_2_Partition_1 1501 1700 
Region_2_Partition_2 1701 1900 
Region_2_Partition_3 1901 2001 

私は:

    V1 V2 V3 
Region_2_Partition_1  1 200 
Region_2_Partition_2 201 400 
Region_2_Partition_3 401 600 

最終パーティションのファイルは、このする必要がありますこれまでのところ私を逃したたくさんのすっきりした解決策があると思います!

おかげ C

答えて

1

編集:申し訳ありませんが、私は通常data.table()具体的な質問を閲覧し、この質問は、データフレームについてであることに気づくことができませんでした!それに応じて私の答えを変更

最後のフレームでcumsum()できるように、 "n"を列として保持します。私はあなたのデータ

region1 <- data.frame(
    label=c('Region_1_Partition_1', 'Region_1_Partition_2', 
'Region_1_Partition_3'), 
    V4=500 
) 

region1$V3 <- cumsum(region1$V4) 
region1$V2 <- region1$V3 - region1$V4 + 1 
region1[, c('label', 'V2', 'V3')] 

最後のコマンドの戻りV4=200

    label V2 V3 
1: Region_1_Partition_1 1 500 
2: Region_1_Partition_2 501 1000 
3: Region_1_Partition_3 1001 1500 

同様のコード

、region2にを与えることができる "再作成" mergeではなく、むしろ rbind()

まずによって達成できないと思われます。今

あなたの組み合わせを実行するために、

out <- rbind(region1[, c('label', 'V4')], region2[, c('label', 'V4')]) 

out$V3 <- cumsum(out$V4) 
out$V2 <- out$V3 - out$V4 + 1 
out[, c('label', 'V2', 'V3')] 


        label V2 V3 
1: Region_1_Partition_1 1 500 
2: Region_1_Partition_2 501 1000 
3: Region_1_Partition_3 1001 1500 
4: Region_2_Partition_1 1501 1700 
5: Region_2_Partition_2 1701 1900 
6: Region_2_Partition_3 1901 2100 

ANOTHER EDIT:パーティションのより多くのソリューションを拡張する方法。

私はここで2つの課題を見ることができます。最初にすべてのものが必要であり、2番目がV4の列で使用するかどうかを判断する必要があります。

これを実行するより効率的な方法があります(リスト内のすべてのテーブルを格納してから、それらを1つのテーブルにまとめるなど)。私はforループを使用します。

ファイル名がすべてfilesというベクトルに入っているとします。あなたのファイルが持っている

out <- data.frame() 
for (file in files) { 

    # read the file. prepend a path before this step if necessary 
    data <- read.csv(file) 

    # determine V4. This assumes that V3 is guaranteed to have a constant difference in any given file 
    # and that the first row is that difference, as in your example data 
    data$V4 <- data$V3[1] 

    data <- data[, c('V1', 'V4')] #note that I switched my first colname to match yours 

    out <- rbind(out, data) 
} 

# Recover V2 and V3 
out$V3 <- cumsum(out$V4) 
out$V2 <- out$V3 - out$V4 + 1 
out[, c('V1', 'V2', 'V3')] 

注意順序であるか、あるいはcumsum()は右ではありません。ファイルが順不同の場合は、テーブルを作成して使用する前に並べ替えることができます。cumsum()

+0

これを試してうまくいきました。スケールアップの提案がありますか?つまり、.csvに20以上の個別のパーティションファイルがあるとしますか? –

+0

私はこれに対処しようとする試みを含めるように答えを編集しました – HarlandMason

関連する問題