私はゲノム範囲のdata.frame(染色体と開始位置)から始めています。私は、1)隣り合っている行と2)他の2つの列の値を共有する行を結合しようとしています。注:私は実際のデータが1000万行以上あるので効率的な方法が欲しいです。R - data.frameの行を比較する(条件に基づいて結合する)
(可能であればdata.table)玩具データ:これらは隣接しているので、1 & 2を組み合わせることができる
DF <- data.frame(SampleID = c(1,1,1,1,1,2,2),
Chr = c(1,1,1,1,2,1,1),
Start = c(1, 101, 201, 401, 500, 1, 101),
End = c(100, 200, 300, 499, 599, 100, 200),
State = c(3,3,2,3,3,2,2)
)
DF
SampleID Chr Start End State
1: 1 1 1 100 3
2: 1 1 101 200 3
3: 1 1 201 300 2
4: 1 1 401 499 3
5: 1 2 500 501 3
6: 2 1 1 100 2
7: 2 1 101 200 2
ライン(1-100 & 101-200)およびSampleID
(1)及びState
を共有(3)。
以下を組み合わせることができない。
- 線2 & 3は
State
S - 線3 & 4にミスマッチしているが隣接していないと
State
- 線4 & 5を共有しない(染色体中の異なります
Chr
) - ライン6 & 7は異なる
SampleID
です。
等が挙げられる。これらをすべて適用すると、最終的な表が作成されます。
FinalDF <- data.frame(SampleID = c(1,1,1,1,2),
Chr = c(1,1,1,2,1),
Start = c(1,201,401,500,1),
End = c(200,300,499,599,200),
State = c(3,2,3,3,2))
FinalDF
SampleID Chr Start End State
1 1 1 1 200 3
2 1 1 201 300 2
3 1 1 401 499 3
4 1 2 500 599 3
5 2 1 1 200 2
これまでのところ、私はGenomicRangesパッケージのreduce関数を使用しようとしましたが、動作しません。
誤った出力
reduce(DF2)
GRanges object with 3 ranges and 0 metadata columns:
seqnames ranges strand
<Rle> <IRanges> <Rle>
[1] 1 [ 1, 300] *
[2] 1 [401, 499] *
[3] 2 [500, 501] *
-------
seqinfo: 2 sequences from an unspecified genome; no seqlengths
私data.frames 10万行の長以上ですが、それを把握することができていないので、私は、data.tableで何かをしようとしていました。
次の質問は、同じ行にあります(もう少し複雑です)が、解決策はありません。 R- collapse rows based on contents of two columns
これは素晴らしい、非常に速く(0.51秒で動作します(DF、SampleID、Chr、状態、info1、info2、info3) 、私はdata.tableが大好きです)。ただし、保存したい列の情報が失われてしまいます。私はby文にそれらを追加できると仮定します(これは0.61秒に時間を変更します)。これはこれを処理する最善の方法ですか? –
それらをグループ化している場合は、「はい」に追加します。もしそれらをグループ化していないのですが、既存のグループと同じであれば、上記の 'State [1]'に似た最初の要素を追加することができます – eddi