У меня есть генетический набор c позиций в геноме, я хочу сгруппировать строки / позиции генома в этом наборе данных в зависимости от связанной дублирующей информации. Под этим я подразумеваю:
Если я есть набор данных точек A, B, C et c.:
Point Connections
A A, B
B B, C
C C, B
D D, E, F, G
Я хочу сгруппировать те, которые все связаны друг с другом (напрямую или нет), установив соответствующую группу числовой столбец для этих строк, поэтому, например, этот набор данных группируется в:
Point Connections Group
A A, B 1
B B, C 1
C C, B 1
D D, E, F, G 2
#A B and C are all connected to each other so are in the same group, even if A and C are
#not directly connected in the Connections column
#D is the first row seen that is unrelated so is put in a separate group which would also
#include D's connecting letters and any connectors of those letters
Образец моего фактического набора данных - это позиции хромосом (CP), где 1-й номер - это хромосома, а 2-й номер (после: ) - это позиция генома на этой хромосоме, поэтому выглядит так (реальные данные составляют ~ 3000 строк):
CP linked_CPS
1:100 1:100, 1:203
1:102 1:102
1:203 1:100, 1:203, 1:400
1:400 1:400
2:400 2:400, 2:401
2:401 2:401, 2:400
Ожидаемый результат группировки связанных строк:
CP linked_CPS Group
1:100 1:100, 1:203 1
1:203 1:100, 1:203, 1:400 1
1:400 1:400 1
1:102 1:102 2
2:400 2:400, 2:401 3
2:401 2:401, 2:402 3
Одно замечание заключается в том, что разные хромосомы (начальное число 1: или 2: из CP
не может быть в одной группе, даже если второе число такое же, например, 1:400
и 2:400
не будут той же группой, что и на c хромосомы 1 и 2).
Также для контекста, моя конечная цель - занять наименьшее и наибольшее положение каждой группы, чтобы установить расстояние между регионами для каждой группы в геноме.
Я видел другие вопросы с аналогичной основой для группировки совпадающей / повторяющейся информации, но не знал, как применить их к этой проблеме, и у меня есть биологические знания, поэтому я не уверен, какие пакеты / функции лучше. Приветствуется любая помощь.
Входные данные:
structure(list(CP = c("1:100", "1:102", "1:203", "1:400", "2:400",
"2:401"), linked_CPS = c("1:100, 1:203", "1:102", "1:100, 1:203, 1:400",
"1:400", "2:400, 2:401", "2:401, 2:402")), row.names = c(NA,
-6L), class = c("data.table", "data.frame"))