去除自环和没有边的顶点。

12

我正在构建一个基因网络。我有一个双列数据框,我将其转换成邻接矩阵并在igraph中使用它。问题是我有一些带有自环的基因,我想去掉自环,然后从网络中去掉没有边(可能是孤立的)的顶点。我尝试了几种方法,但它们都不起作用。我的代码是:

 InnatedGraph <- graph.data.frame(innate,directed=FALSE)
 V(InnatedGraph)$label.cex = 0.4
 plot(InnatedGraph,vertex.label=V(InnatedGraph)$symbol, vertex.size=5)

innate是我的双列数据框。我已经尝试使用degree函数删除度数为0的顶点,但不幸的是它似乎不起作用(也许是因为自环基因的度数为1)。

bad.vs<-V(InnatedGraph)[degree(InnatedGraph) == 0] 
clean <-delete.vertices(InnatedGraph, bad.vs)

我尝试使用 BioNet 软件包中的另一个函数 "rmSelfLoops",借助该函数,我能够删除自环边,但仍无法删除没有边的顶点。

test<-rmSelfLoops(InnatedGraph)

为了更容易理解,我还会附上我的网络图片。enter image description here


2
在转换为igraph对象之前,从数据框中删除fromColumntoColumns值相同的行? - zx8754
1
请阅读关于“如何提出好问题”的信息和如何提供“可重现的示例”。这将使其他人更容易地帮助您。 - zx8754
@zx8754 非常感谢,我会尝试的! - Saad
@zx8754,你能帮我删除行吗?我搜索了很多,找到了删除重复行的方法,但不是我想要的。 - Saad
请提供示例数据,这样@lukeA就可以更好地解决您的问题。 - zx8754
为了留存记录,删除代表自环的行可能会意外地删除孤立节点。更安全的做法是保留边列表不变,并使用@lukeA提到的simplify函数。 - Brooks Ambrose
2个回答

20

考虑这个示例图以及它的两个子集/修改:

library(igraph)
set.seed(1)
g <- random.graph.game(10, p.or.m = 3, "gnm") + edge(7,7)
coords <- layout.auto(g)
par(mfrow = c(1,3))
plot(g, layout = coords)
plot(simplify(g), layout = coords) # remove loops and multiple edges
plot(delete.vertices(simplify(g), degree(g)==0)) # additionally delete isolated nodes

enter image description here


使用评论中的 OP 的示例数据:

df <- read.csv(header=F, row.names = 1, stringsAsFactors=F, text='"53","ENSG00000175104","ENSG00000175104"
"54","ENSG00000174775","ENSG00000175104"
"55","ENSG00000032688","ENSG00000027164"
"56","ENSG00000175104","ENSG00000140968"
"57","ENSG00000027164","ENSG00000041515"
"58","ENSG00000027164","ENSG00000025498"')
library(igraph)
( dfclean <- subset(df, V2!=V3) ) # remove rows where source==target
#                V2              V3
# 54 ENSG00000174775 ENSG00000175104
# 55 ENSG00000032688 ENSG00000027164
# 56 ENSG00000175104 ENSG00000140968
# 57 ENSG00000027164 ENSG00000041515
# 58 ENSG00000027164 ENSG00000025498
par(mfrow = c(1,3))
plot(graph_from_data_frame(df), edge.arrow.size = .5) # orig
plot(simplify(graph_from_data_frame(df)), edge.arrow.size = .5) # same as
plot(graph_from_data_frame(dfclean), edge.arrow.size = .5) # this one

所以我有一个像这样的数据框。 - Saad
"53","ENSG00000175104","ENSG00000175104" "54","ENSG00000174775","ENSG00000175104" "55","ENSG00000032688","ENSG00000027164" "56","ENSG00000175104","ENSG00000140968" "57","ENSG00000027164","ENSG00000041515" "58","ENSG00000027164","ENSG00000025498"您可以看到第一行中同一基因与自身有边缘,我该如何从数据框中删除此行? - Saad
1
@Saad:创建图形g,使用simplify(g) - lukeA
@lukeA,你不应该在一个调用中同时使用simplify(g)degree(g)==0来删除顶点,因为它无法删除仅有自环的顶点。你应该将其修改为类似这样的形式:delete.vertices(simplify(g), degree(simplify(g))==0)或者分成两步进行。 - gawi

1
使用函数graph_from_adjacency_matrix将您的邻接矩阵转换成图形,并设置参数diag=F。这样可以消除自环。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接