使用R的dplyr识别社交网络数据中边的对称性问题
解决社交网络边对称性识别及自环异常问题(dplyr方案)
核心思路
- 先单独处理自环(source=target),避免干扰对称判断;
- 对非自环边生成标准化标识:将source和target按固定顺序(如字母序)拼接,让互为反向的边拥有相同标识;
- 按标准化标识分组,判断组内是否存在两条权重相等的反向边,以此标记对称性。
具体代码实现
首先加载依赖包并构造示例数据:
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)
结果说明
运行后示例数据的输出:
| source | target | weight | symmetry |
|---|---|---|---|
| A | B | 5 | Symmetrical |
| B | A | 5 | Symmetrical |
| A | C | 3 | Asymmetrical |
| C | A | 4 | Asymmetrical |
| D | D | 2 | Self-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
相关产品推荐
相关产品推荐

