Как сгруппировать строки на основе соединяющей или повторяющейся информации? - PullRequest
1 голос
/ 09 июля 2020

У меня есть генетический набор 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"))

1 Ответ

2 голосов
/ 09 июля 2020

Если я правильно понял ваш вопрос, вы ищете подключенные компоненты на графике.

Приведенный ниже код превращает ваш data.frame в график и находит эти компоненты.

library(tidyverse)
library(tidygraph)

df <- 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"))

df %>% 
  separate_rows(linked_CPS, sep = ", ") %>% 
  as_tbl_graph() %>% 
  activate(nodes) %>% 
  mutate(group = group_components()) %>% 
  as_tibble()

что дает

# A tibble: 7 x 2
  name  group
  <chr> <int>
1 1:100     1
2 1:102     3
3 1:203     1
4 1:400     1
5 2:400     2
6 2:401     2
7 2:402     2
...