r - 从列到行的对的棘手分组
问题描述
我有一对代表基因相同的个体,在一张表中。我将使用字母来表示配对。例如,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 功能的组合,如传播、联合、分组等,但没有成功。我很难得到一些健壮和完整的东西。
解决方案
您可以将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
如果要进一步匹配所需的输出,可以添加dplyr
and 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
推荐阅读
- vba - 使用另一个范围变量设置范围变量
- ios - 斯威夫特:可解码
- javascript - 反应语义UI按钮悬停
- excel - 保存工作簿的 vba 脚本覆盖输入的文件名
- vuetify.js - v-date-picker 上的默认年份视图
- r-markdown - Rmarkdown 中的 Bibtex - 第二作者的名字和姓氏在引用中交换
- pyomo - 在 Pyomo 中创建 if..then 类型规则(约束)
- javascript - Angular 6 - 上传文件
- sql-server - 从 temptable 查看数据
- java - 是否存在用于使用 AWS SDK InitiateAuth 的骆驼组件?