R语言中去除无向图边列表的双向重复行
去除无向网络边列表中的双向重复行问题
我是R语言新手,正在用igraph做网络分析。我的Excel数据集规模较大,先执行以下代码拆分列、转矩阵生成边列表,去NA后构建无向图:
test<-separate(ID_test, 'Contacts 1', paste("Contacts", 1:20, sep="_"), sep=",", extra="drop") m <- as.matrix(test) el <- cbind(m[, 1], c(m[, -1])) el2<-na.omit(el) testel<- graph_from_edgelist(el2, directed=FALSE) plot(testel)
但边列表里存在V1和V2值互换的重复行(比如第一行和最后一行),导致图中出现重复边。试了几种方法都没解决:
el4<-el3[!duplicated(el[c("V1", "V2")]),] # 识别不了双向重复行 el4<-el3[!duplicated(paste(pmin(V1, V2), pmax(V1, V2)))] # 报错:Error in pmin(V1, V2) : object 'V1' not found el4<-el3[!duplicated(paste(pmin("V1", "V2")), pmax("V1", "V2"))] # 结果无法用于构建网络 g <- graph_from_edgelist(unique(rbind(el2[, 1:2])), directed = FALSE) # 没变化 plot(g)
解决方法
方法一:标准化边的顺序后去重
把每条边的两个节点按排序生成唯一标识,再基于标识去重:
# 转换为数据框方便操作 el_df <- as.data.frame(el2, stringsAsFactors = FALSE) # 对每行节点排序,生成标准化边标识 el_df$standard_edge <- apply(el_df, 1, function(x) paste(sort(x), collapse = "-")) # 保留唯一边 el_unique <- el_df[!duplicated(el_df$standard_edge), c(1,2)] # 转回矩阵构建无向图 g <- graph_from_edgelist(as.matrix(el_unique), directed = FALSE) plot(g)
方法二:利用igraph自带的去重功能
直接在构建图后,用simplify()一键去除重复边和自环(如果存在):
# 构建原始图 testel<- graph_from_edgelist(el2, directed=FALSE) # 去除重复边与自环 g_simplified <- simplify(testel, remove.multiple = TRUE, remove.loops = TRUE) plot(g_simplified)
方法三:用tidyverse工具链处理
如果习惯用dplyr,可以按节点大小排序后去重:
library(dplyr) el_unique <- as.data.frame(el2) %>% rowwise() %>% mutate( node1 = min(V1, V2), node2 = max(V1, V2) ) %>% ungroup() %>% distinct(node1, node2, .keep_all = FALSE) %>% select(node1, node2) g <- graph_from_edgelist(as.matrix(el_unique), directed = FALSE) plot(g)
内容的提问来源于stack exchange,提问作者MemeBeauftragter
相关产品推荐
相关产品推荐

