Объединить строки во фрейме данных, которые имеют похожие (но не равные) значения

У меня есть 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
...

И я хочу объединить строки, которые разделяют chr а также strand и имеют одинаковые начальные и конечные точки (скажем, с расстоянием 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:

Было бы также хорошо, если бы только одна из переменных (SampleID или же Value) будет объединен.

1 ответ

Мы могли бы сделать группировку по 'Chr', 'Strand', создать идентификатор группировки на основе разницы между смежными элементами в столбцах 'Start' и 'End' после orderПри помощи 'Start', 'End', затем сгруппированных по 'Chr', 'Strand' и 'ind', вы получите первый элемент 'Start', 'End', а pasteэлементы в столбцах "SampleID" и "Value"

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

Другие вопросы по тегам