当前位置: 首页 > 知识库问答 >
问题:

如何根据连接或重复信息对行进行分组?

余信然
2023-03-14

我有一个基因组位置的基因数据集,我希望根据相关的重复信息对该数据集中的行/基因组位置进行分组。我的意思是:

如果我有点a、B、C等的数据集:

Point Connections
A       A, B
B       B, C
C       C, B
D       D, E, F, G

我想通过为这些行设置匹配的组编号列来对彼此具有连接(无论是否直接)的那些进行分组,例如,此数据集分组为:

Point Connections     Group
A       A, B            1
B       B, C            1
C       C, B            1 
D       D, E, F, G      2

#A B and C are all connected to each other so are in the same group, even if A and C are 
#not directly connected in the Connections column
#D is the first row seen that is unrelated so is put in a separate group which would also
#include D's connecting letters and any connectors of those letters

我的实际数据集的一个样本是染色体位置(CP),其中第一个数字是染色体,第二个数字(后面是A:)是该染色体上的基因组位置,因此看起来像这样(实际数据约为3000行):

CP        linked_CPS
1:100    1:100, 1:203
1:102    1:102
1:203    1:100, 1:203, 1:400
1:400    1:400
2:400    2:400, 2:401
2:401    2:401, 2:400

预期输出分组连接行:

CP        linked_CPS          Group
1:100    1:100, 1:203           1
1:203    1:100, 1:203, 1:400    1
1:400    1:400                  1
1:102    1:102                  2
2:400    2:400, 2:401           3
2:401    2:401, 2:402           3

需要注意的一点是,不同的染色体(< code>CP的起始编号1:或2:不能在同一组中,即使第二个编号相同,例如< code>1:400和< code>2:400与它们在染色体1和2上不在同一组中)。

同样对于上下文,我的最终目标是取每个组的最小和最大位置来设置基因组中每个组的区域距离。

我已经看到了其他具有类似分组匹配/重复信息基础的问题,但不确定如何将它们应用于此问题,并且我有生物学背景,因此不确定哪些包/函数是最好的。任何帮助都将不胜感激。

输入数据:

structure(list(CP = c("1:100", "1:102", "1:203", "1:400", "2:400", 
"2:401"), linked_CPS = c("1:100, 1:203", "1:102", "1:100, 1:203, 1:400", 
"1:400", "2:400, 2:401", "2:401, 2:402")), row.names = c(NA, 
-6L), class = c("data.table", "data.frame"))

共有1个答案

卫沈义
2023-03-14

如果我正确理解您的问题,您正在图中寻找连通组件。

下面的代码将您的data.frame转换为图形并找到这些组件。

library(tidyverse)
library(tidygraph)

df <- structure(list(CP = c("1:100", "1:102", "1:203", "1:400", "2:400", 
                      "2:401"), linked_CPS = c("1:100, 1:203", "1:102", "1:100, 1:203, 1:400", 
                                               "1:400", "2:400, 2:401", "2:401, 2:402")), row.names = c(NA, 
                                                                                                        -6L), class = c("data.table", "data.frame"))

df %>% 
  separate_rows(linked_CPS, sep = ", ") %>% 
  as_tbl_graph() %>% 
  activate(nodes) %>% 
  mutate(group = group_components()) %>% 
  as_tibble()

这给了

# A tibble: 7 x 2
  name  group
  <chr> <int>
1 1:100     1
2 1:102     3
3 1:203     1
4 1:400     1
5 2:400     2
6 2:401     2
7 2:402     2
 类似资料:
  • 问题内容: 所以,我有一张表,上面有这样的行: 每次扫描警报时(即每次触发或清除警报时)都会添加“已扫描的警报”行。任何警报都会添加带有特定Ev_Custom1的行。第一列Ev_Message包含一个计算机ID,该ID使我可以将警报与其他计算机分开。(您不喜欢任意的列名吗?)超过900条独特的警报消息。 我希望查询返回的内容是这样的: 这将是两个日期之间过滤的查询。我可以更改进入表的数据,但是有9

  • 假设我有以下Bus对象数组: 在总线数组填满之后,我想按总线号对总线数组进行排序(这是一个字符串,例如“501”)。每个总线对象都有一个总线号(总线[index].number)。没有重复的公共汽车号码。我怎样才能做到这一点?我看到了过滤器,但我不确定如何应用它。

  • 我想按多个列对熊猫数据框进行分组。每个Row都有一个整数、一个Name和一个额外的数值。我希望最终的Dataframe包含Name具有最高整数的每一行。 通过分组数据帧,只有第0行应该消失。第3行和第4行仍应包括在数据框中。

  • 我有一个像这样的数据框- 我有一个这样的列表- 现在,我想根据列名列表对数据框进行排序 因此,新的数据框将有列名称-

  • 问题内容: 我无法使用LDAP验证用户。我有以下详细信息: 我可以使用上述详细信息搜索值,但是如何使用用户名和密码对用户进行身份验证? 如果您遵循我之前的问题,那么您将理解,我可以成功连接到LDAP服务器,但无法对其进行身份验证。 用户验证: 我无法使用来连接到LDAP服务器,应该如何使用。我可以搜索给定的用户为。 问题答案: 这是我在各个地方发现的东西的混搭。如果您不想使用UnboundID S

  • 让我们假设我的数据frame如下所示: 我有一个的列表,我想从Dataframe中删除它们。该列表超过200个长度,因此多个筛选器太麻烦了。 是否可以通过传递的列表来进行筛选?