2017-11-18 129 views
1

我有一個df,如:加入其中有一個數據幀行類似(但不等於)值

SampleID Chr Start End Strand Value 
1: rep1  1 11001 12000  -  10 
2: rep1  1 15000 20100  -  5 
3: rep2  1 11070 12050  -  1 
4: rep3  1 14950 20090  +  20 
... 

而且我想加入共享相同chrstrand,並具有類似的起始行和終點(比如說100 +/-距離)。對於執行行連接的那些列,我還想連接SampleID名稱和Value。與前面的示例類似:

SampleID Chr Start End Strand Value 
1:rep1,rep2 1 11001 12000  -  10,1 
2: rep1  1 15000 20100  -  5 
4: rep3  1 14950 20090  +  20 
... 

想法?謝謝!

編輯:

我發現fuzzyjoin包R(https://cran.r-project.org/web/packages/fuzzyjoin/index.html)。有沒有人有這個包的經驗?

EDIT2:

這也將是不錯的,如果只是變量(SampleIDValue)中的一個將被連接起來。

回答

1

我們可以按'Chr','Strand'進行分組,根據'開始','結束'後order之後的'開始'和'結束'列中相鄰元素之間的差異創建分組ID,然後通過「CHR」,「鏈」和「IND」組合,得到「開始」,「結束」的第一要素,而paste荷蘭國際集團在「SampleID」和「價值」列

library(data.table) 
df[order(Start, End), ind := rleid((Start - shift(Start, fill = Start[1])) < 100 & 
    (End - shift(End, fill = End[1])) < 100), by =.(Chr, Strand) 
    ][, .(Start = Start[1], End = End[1], 
    SampleID = toString(SampleID), Value = toString(Value)) , .(Strand, Chr, ind),] 
#  Strand Chr ind Start End SampleID Value 
#1:  - 1 1 11001 12000 rep1, rep2 10, 1 
#2:  - 1 2 15000 20100  rep1  5 
#3:  + 1 1 14950 20090  rep3 20 

注意的要素:假設'df'是一個data.table

+0

哇!這很好,我想知道你是否可以用剛剛使用的命令更清楚一些。如果我錯了,請糾正我: 您爲每個查看「Chr」,「Strand」和「Start」和「End」的條件生成一個「標籤」,它滿足我要求的要求(+/- 100 )。然後你加入具有相同「標籤」的標籤,並將「SampleID」和「Value」添加爲一個字符串。我對嗎? 在我的'data.table'中發生的另一件奇怪事情是,恰好在相同位置的行不執行連接。問題在哪裏? – Tato14

+0

@ Tato14在第一組'df [i,j,by]'中,我們用'order'指定'i',以便按升序排列值。 'by'是分組變量'Chr','Strand',在'j'中,我們將邏輯輸出的run-length-id('rleid')分配爲新列,然後在第二組中,我們正在通過操作進行分組。現在還不清楚你什麼時候行數完全在sam位置的行不會執行連接' – akrun

+0

感謝您的解釋!關於最後一部分,「位置」的意思是「Chrom」,「Strand」,「Start」和「End」。 – Tato14

相關問題