首页 > 解决方案 > 从列到行的对的棘手分组

问题描述

我有一对代表基因相同的个体,在一张表中。我将使用字母来表示配对。例如,a、x、y 和 b 是同一个人!

Mate1    Mate2
a        x
a        y
b        y
c        z
d        l
d        j
d        m
j        n
f        o
f        p
f        q
f        r

可以看到,Mate1 在 Mate2 中可以有多个匹配,反之亦然。我想得到这个:

Mate1    Mate2    Mate3    Mate4    Mate5   
a        x        y         b           
c        z                  
d        l        m        j        n       
f        o        p        q        r

这个想法是:我希望每组个体有一行,但有时这涉及通过 Mate1 或 Mate2 将配对连接数次。示例:a 通过 y 的中间体链接到 b。在我的真实数据集中,你可能有更多像 y 这样的中间体。我希望它们都在一行中(或者如果更容易,可以添加一个带有“组”ID 的新列)。

关于如何做到这一点的任何想法?非常感谢!

我已经尝试了很多 tidyverse 功能的组合,如传播、联合、分组等,但没有成功。我很难得到一些健壮和完整的东西。

标签: rtidyverse

解决方案


您可以将igraph包用于此任务:

sort(clusters(graph.data.frame(df, directed = FALSE))$membership)

a b x y c z d j l m n f o p q r 
1 1 1 1 2 2 3 3 3 3 3 4 4 4 4 4 

如果要进一步匹配所需的输出,可以添加dplyrand tidyr

pairs <- sort(clusters(graph.data.frame(df, directed = FALSE))$membership)

pairs %>%
 enframe() %>%
 group_by(value) %>%
 mutate(variable = paste0("Mate", 1:n())) %>%
 ungroup() %>%
 spread(variable, name) %>%
 select(-value)

  Mate1 Mate2 Mate3 Mate4 Mate5
  <chr> <chr> <chr> <chr> <chr>
1 a     b     x     y     <NA> 
2 c     z     <NA>  <NA>  <NA> 
3 d     j     l     m     n    
4 f     o     p     q     r   

推荐阅读