从列到行对的棘手分组

Non*_*pov 4 r tidyverse

我有一对在桌子上代表遗传上相同的个体。我将使用字母作为配对。例如,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
Run Code Online (Sandbox Code Playgroud)

如您所见,Mate1在Mate2中可以有多个匹配项,反之亦然。我想获得这个:

Mate1    Mate2    Mate3    Mate4    Mate5   
a        x        y         b           
c        z                  
d        l        m        j        n       
f        o        p        q        r
Run Code Online (Sandbox Code Playgroud)

这个想法是:我希望每组个人一行,但是有时这涉及通过Mate1或Mate2链接对多次。示例:a通过y的中间位置链接到b。在我的真实数据集中,您可能会拥有更多类似y的中间体。我希望所有这些都在同一行中(或者如果更容易的话,添加带有“组” ID的新列)。

关于如何做的任何想法?非常感谢!

我已经尝试了许多tidyverse功能的组合,例如传播,联合,分组等,但没有成功。我努力获得一些坚固而完整的东西。

tmf*_*mnk 6

您可以将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 
Run Code Online (Sandbox Code Playgroud)

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

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   
Run Code Online (Sandbox Code Playgroud)