Объединить строки во фрейме данных, которые имеют похожие (но не равные) значения
У меня есть 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