Подсчет строк фильтрации Dataframe по комбинациям уровней - PullRequest
1 голос
/ 02 мая 2019

У меня есть этот фрейм данных (который является выходом многоблочного пересекающегося между 8 различными файлами Bed моих данных ChIp-seq):

    head(Table,)
    chrom   start     end num  list
2   chr1 4491607 4493602   2   6,7
6   chr1 4571540 4571826   2   7,8
15  chr1 5019126 5020672   2   2,7
21  chr1 7139275 7139745   3 4,6,7
23  chr1 7398185 7398658   2   7,8
28  chr1 9745462 9745912   4 1,4,6,7

Столбец «список» - это символьная строка, которая представляет присутствие этого конкретного пика в списке моих выборок.

Например, пик "2" находится в любом из образцов № 6 и 7.

Я хочу посчитать, сколько раз каждая комбинация из 2 выборок будет найдена в наборе данных, создав таблицу, в которой собрана информация.

Так что, в основном, многоблочное пересечение возвращает слишком много перекрытий. Мне просто интересно, как сэмплы перекрываются друг с другом 2 в то время.

Например, образцы 6 и 7 находятся в любом пике 2,21,28 , а образцы 4 и 6 находятся в пиках 21 и 28

Посредством пакета tydiverse я могу решить проблему с 1 образцом за раз, но я не могу "сделать цикл" для каждой комбинации.

     Table %>%
  filter(str_detect(list, "6,7"))

Таким образом я получаю обратно все, что имеет такую ​​комбинацию:

   chrom   start     end num  list
2   chr1 4491607 4493602   2   6,7
21  chr1 7139275 7139745   3 4,6,7
28  chr1 9745462 9745912   4 1,4,6,7

Я думаю, что это недостаточно эффективно и требует много скриптов, так как мне нужно было бы вручную фильтровать каждую комбинацию: Чтобы назвать несколько:

  • 7,8
  • 6,8
  • 5,8
  • 4,8
  • 3,8
  • 2,8
  • 1,8
  • 6,7
  • продолжает

Выполнение этого «моего пути» было бы что-то ужасное:

Counts <- NULL
Pippo <- Table %>%
  filter(str_detect(list, "7,8"))
Counts <- cbind(nrow(Pippo))

Pippo <- Table %>%
  filter(str_detect(list, "6,8"))
Counts <- cbind(Counts, nrow(Pippo))

Pippo <- Table %>%
  filter(str_detect(list, "5,8"))
Counts <- cbind(Counts, nrow(Pippo))

Pippo <- Table %>%
  filter(str_detect(list, "4,8"))
Counts <- cbind(Counts, nrow(Pippo))

Pippo <- Table %>%
  filter(str_detect(list, "3,8"))
Counts <- cbind(Counts, nrow(Pippo))

Pippo <- Table %>%
  filter(str_detect(list, "2,8"))
Counts <- cbind(Counts, nrow(Pippo))

Pippo <- Table %>%
  filter(str_detect(list, "1,8"))
Counts <- cbind(Counts, nrow(Pippo))

Не могли бы вы предложить мне лучший способ подсчитать каждую комбинацию и создать этот сводный фрейм данных?

Большое спасибо

1 Ответ

1 голос
/ 02 мая 2019

Рассмотрим базу R с двумя sapply вызовами: один с combn для построения всех парных строк, а затем другой с grepl для подстановки фрейма данных для получения количества строк:

pairs <- sapply(combn(1:8, 2, simplify=FALSE), function(i) paste(i, collapse=","))

Counts <- sapply(pairs, function(i) nrow(subset(Table, grepl(i, `list`))))

Counts
# 1,2 1,3 1,4 1,5 1,6 1,7 1,8 2,3 2,4 2,5 2,6 2,7 2,8 3,4 3,5 3,6 3,7 3,8 4,5 4,6 
#   0   0   1   0   0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   2 
# 4,7 4,8 5,6 5,7 5,8 6,7 6,8 7,8 
#   0   0   0   0   0   3   0   2 

В качестве альтернативы, с аккуратной версией (dplyr + purrr):

pairs <- combn(1:8, 2, simplify=FALSE) %>% 
  map(~(paste(., collapse=","))) %>%
  unlist()

Counts <- pairs %>% 
  map(~(filter(Table, str_detect(list, .)) %>% nrow)) %>%
  setNames(pairs) %>%
  unlist()

Counts
# 1,2 1,3 1,4 1,5 1,6 1,7 1,8 2,3 2,4 2,5 2,6 2,7 2,8 3,4 3,5 3,6 3,7 3,8 4,5 4,6 
#   0   0   1   0   0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   2 
# 4,7 4,8 5,6 5,7 5,8 6,7 6,8 7,8 
#   0   0   0   0   0   3   0   2
...