Как рассчитать перекрытие между разными категориями в R - PullRequest
0 голосов
/ 01 июля 2019

Я прочитал по всему форуму, но не нашел желаемого ответа.

У меня есть следующий набор данных:

Dataset

Важными столбцами являются TGEClass и пептид:

Я хотел бы рассчитать перекрытие между различными классами TGE

Я использовал Calculate.overlap (TGE) из VennDiagram, но это не дает мне желаемого результата;

Код R с фиктивным набором данных:

# A simple single-set diagram
C1 <- as.data.frame(letters[1:10])
C2 <- as.data.frame(letters[1:10])
data =cbind(C1,C2)

overlap <- calculate.overlap(data)
overlap = as.data.frame(overlap)

Результат R: Результат:

  a1 a2 a3
1  a  a  a
2  b  b  b
3  c  c  c
4  d  d  d
5  e  e  e
6  f  f  f

Желаемый результат будет выглядеть так:

TGEClass

Желаемый результат

10 генов экспрессируются в обоих классах TGE

50 генов в единственной альтернативе

60 генов в коротком

Это в основном диаграмма ven, но в табличном формате.

Обратите внимание, что у каждого гена разное количество категорий классов TGE.

Я очень плохо знаком с R, поэтому любая помощь будет принята с благодарностью.

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

Ишак

1 Ответ

0 голосов
/ 02 июля 2019

Вывод VennDiagram::calculate.overlap() не очень удобен для последующего использования (здесь с использованием as.data.frame вам просто повезло, так как оба вектора имеют одинаковый размер).

На самом деле вы можете использовать tidyverse, чтобы вычислить его самостоятельно и вернуть сводку:

library(tidyverse)
list(
  "Cardiome" = letters[1:10],
  "SuperSet" = letters[8:24]
) %>% 
  map2_dfr(., names(.), ~tibble::enframe(.x) %>% mutate(group=.y)) %>% 
  add_count(value) %>%  
  group_by(value) %>% 
  summarise(group2 = ifelse(n()==2, "both", group)) %>% 
  count(group2)
#> # A tibble: 3 x 2
#>   group2       n
#>   <chr>    <int>
#> 1 both         3
#> 2 Cardiome     7
#> 3 SuperSet    14

Если вы хотите придерживаться вывода VennDiagram::calculate.overlap(), вы можете использовать что-то вроде:

library(tidyverse)
overlap <- VennDiagram::calculate.overlap(
  x = list(
    "Cardiome" = letters[1:10],
    "SuperSet" = letters[8:24]
  )
);
map2_dfr(overlap, names(overlap), ~tibble::enframe(.x) %>% mutate(group=.y)) %>% 
  spread(group, group) %>% 
  mutate(a1_only = !is.na(a1) & is.na(a2),
         a2_only = !is.na(a2) & is.na(a1),
         both = !is.na(a2) & !is.na(a1)) %>% 
  summarise_at(c("a1_only", "a2_only", "both"), sum) %>% 
  gather(group, number, everything())
#> # A tibble: 3 x 2
#>   group   number
#>   <chr>    <int>
#> 1 a1_only     10
#> 2 a2_only     17
#> 3 both         0
...