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

使用R的dplyr识别社交网络数据中边的对称性问题

解决社交网络边对称性识别及自环异常问题(dplyr方案)

核心思路

  1. 先单独处理自环(source=target),避免干扰对称判断;
  2. 对非自环边生成标准化标识:将source和target按固定顺序(如字母序)拼接,让互为反向的边拥有相同标识;
  3. 按标准化标识分组,判断组内是否存在两条权重相等的反向边,以此标记对称性。

具体代码实现

首先加载依赖包并构造示例数据:

library(dplyr)
library(purrr) # 用于生成标准化边标识

# 示例数据集(包含自环、对称边、不对称边)
edges <- tibble(
  source = c("A", "B", "A", "C", "D"),
  target = c("B", "A", "C", "A", "D"),
  weight = c(5, 5, 3, 4, 2)
)

处理流程代码:

edges_processed <- edges %>%
  # 标记自环并生成标准化边标识
  mutate(
    is_self_loop = source == target,
    # 将source和target排序后拼接,确保反向边的标识一致
    edge_key = pmap_chr(list(source, target), ~paste(sort(c(..1, ..2)), collapse = "-"))
  ) %>%
  # 按标准化标识分组,判断对称性
  group_by(edge_key) %>%
  mutate(
    # 非自环场景:组内有且仅有2条边,且权重完全一致
    is_symmetrical = ifelse(is_self_loop, FALSE, n() == 2 & n_distinct(weight) == 1)
  ) %>%
  ungroup() %>%
  # 生成最终symmetry列
  mutate(
    symmetry = case_when(
      is_self_loop ~ "Self-loop",  # 自环单独标记
      is_symmetrical ~ "Symmetrical",
      TRUE ~ "Asymmetrical"
    )
  ) %>%
  # 移除中间辅助列(按需保留)
  select(-is_self_loop, -edge_key, -is_symmetrical)

结果说明

运行后示例数据的输出:

sourcetargetweightsymmetry
AB5Symmetrical
BA5Symmetrical
AC3Asymmetrical
CA4Asymmetrical
DD2Self-loop

可选调整

如果不需要单独标记自环,希望直接归为Asymmetrical,只需修改case_when部分:

symmetry = case_when(
  is_symmetrical ~ "Symmetrical",
  TRUE ~ "Asymmetrical"
)

备选方案(igraph包)

若允许使用igraph,可借助图结构直接判断反向边:

library(igraph)

# 构建有向图
g <- graph_from_data_frame(edges, directed = TRUE)

# 逐边检查是否存在权重相等的反向边
edges$symmetry <- sapply(E(g), function(e) {
  rev_edge <- E(g)[from = to(e), to = from(e)]
  length(rev_edge) > 0 && edge_attr(g, "weight", rev_edge) == edge_attr(g, "weight", e)
})

# 转换为字符标签并处理自环
edges$symmetry <- ifelse(edges$symmetry, "Symmetrical", "Asymmetrical")
edges$symmetry[edges$source == edges$target] <- "Self-loop"

内容的提问来源于stack exchange,提问作者Catherine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 08:30:10