如何计算R中不同类别之间的重叠

时间:2019-07-01 15:33:58

标签: r dataframe overlap

我已经在论坛上阅读过,但是没有找到想要的答案。

我有以下数据集:

Dataset

重要的列是TGEClass和多肽:

我想计算不同的TGE类之间的重叠

我使用了来自VennDiagram的calculate.overlap(TGE),但这并没有给我想要的结果;

带有伪数据集的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

Desired Result

两个TGE类均表达10个基因

只有50个基因

仅短短60个基因

它基本上是一个ven图,但以表格格式。

请注意,每个基因都有不同数量的TGE类类别。

我是R的新手,所以将不胜感激。

非常感谢

Ishack

1 个答案:

答案 0 :(得分:0)

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