加入数据框中具有相似(但不相等)值的行

时间:2017-11-18 09:59:37

标签: r data.table fuzzyjoin

我有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
...

想法?谢谢!

编辑:

我找到了R(https://cran.r-project.org/web/packages/fuzzyjoin/index.html)的fuzzyjoin包。有没有人有这个包的经验?

EDIT2:

如果仅将其中一个变量(SampleIDValue)连接起来也会很好。

1 个答案:

答案 0 :(得分:1)

我们可以按照' Chr'' Strand'进行分组,根据'开始'中的相邻元素之间的差异创建分组ID。并且'结束'在order开始'结束'之后的列,然后按照' Chr'' Strand'和' ind',获取'开始''结束'的第一个元素,同时paste' SampleID&#39}中的元素;和'价值'柱

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

注意:假设&#39; df&#39;是data.table