如何从R数据框生成无重复igraph边列表并过滤低频边
R 生成分组内机构关联边列表及边过滤方法
生成符合要求的无重复边列表
使用tidyverse套件实现,逻辑为按分组拆分数据,跳过样本量小于2的分组,对每个分组内的机构生成无顺序的两两组合,再做组内去重:
library(tidyverse) # 构造示例数据 df <- tibble( INSTITUTION = c("University1", "University1", "University3", "University4", "University1", "University3"), GROUP = c("Group1", "Group1", "Group2", "Group2", "Group2", "Group3") ) # 生成edgelist edgelist <- df %>% group_split(GROUP) %>% map_dfr(function(group_df){ # 仅保留样本量≥2的分组 if(nrow(group_df) < 2) return(NULL) # 生成无顺序的两两组合,避免A-B/B-A重复 combn(group_df$INSTITUTION, 2, simplify = FALSE) %>% map_dfr(~tibble(EDGE1 = .x[1], EDGE2 = .x[2])) %>% # 组内去重完全相同的边 distinct(EDGE1, EDGE2) })
输出结果和需求预期完全一致:
| EDGE1 | EDGE2 |
|---|---|
| University1 | University1 |
| University3 | University4 |
| University3 | University1 |
| University4 | University1 |
如果不需要自环(即同一机构的关联),可在上述代码最后添加filter(EDGE1 != EDGE2)过滤即可。
按出现频次过滤边
方法1:直接在edgelist阶段过滤
针对无向网络,先对每条边的两个节点做排序生成统一标识,统计频次后过滤:
# 设置频次阈值,小于该值的边会被剔除 freq_threshold <- 10 filtered_edgelist <- edgelist %>% rowwise() %>% # 生成边的统一标识,保证A-B和B-A算作同一条边 mutate(edge_key = paste(sort(c(EDGE1, EDGE2)), collapse = "_")) %>% ungroup() %>% add_count(edge_key, name = "edge_freq") %>% filter(edge_freq >= freq_threshold) %>% select(EDGE1, EDGE2)
方法2:生成igraph对象后过滤
如果你已经构建了igraph网络对象,可以直接对边做过滤:
library(igraph) # 构建无向网络 g <- graph_from_data_frame(edgelist, directed = FALSE) # 统计每条边的重复出现次数 E(g)$freq <- count_multiple(g) # 剔除出现次数小于10的边 g_filtered <- delete_edges(g, which(E(g)$freq < 10))
内容的提问来源于stack exchange,提问作者Amalia
相关产品推荐
相关产品推荐

