You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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)
  })

输出结果和需求预期完全一致:

EDGE1EDGE2
University1University1
University3University4
University3University1
University4University1

如果不需要自环(即同一机构的关联),可在上述代码最后添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 14:51:02