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

从规整数据框生成节点与边数据框的技术问询

搞定VisNetwork的节点和边生成!

我来帮你把这个数据框转换成适合VisNetwork的节点(nodes)和边(edges)数据框,直接就能用来画分组内的连接强度图啦~

首先先确认你的原始数据:

df <- data.frame(var1 = c(1,1,1,2,2,3,3,3,3), cat1 = c("A","B","D","B","C","D","E","B","A"))

第一步:生成节点数据框

节点就是所有唯一的cat1值,我们直接提取并设置id和label(VisNetwork要求的核心列):

library(dplyr)
library(tidyr)
library(visNetwork)

nodes <- df %>%
  distinct(cat1) %>%
  rename(id = cat1, label = cat1)

运行后nodes会是这样的:

id label
1 A A
2 B B
3 D D
4 C C
5 E E

第二步:生成边数据框

核心是统计同一var1分组内不同cat1之间的连接次数(也就是权重),这里要注意:A-B和B-A是同一条边,所以要统一顺序避免重复计数:

edges <- df %>%
  # 按var1分组处理每个组的cat1
  group_by(var1) %>%
  # 对每个组的cat1生成所有两两组合,存成列表
  summarise(pairs = list(combn(cat1, 2, simplify = FALSE))) %>%
  # 把列表展开成每行一个组合
  unnest(pairs) %>%
  # 把组合拆成from和to列
  mutate(from = map_chr(pairs, ~.[1]),
         to = map_chr(pairs, ~.[2])) %>%
  # 统一边的顺序:from取较小的字符,to取较大的,避免A/B和B/A重复
  mutate(from = pmin(from, to),
         to = pmax(from, to)) %>%
  # 统计每个(from, to)对出现的次数,作为权重
  count(from, to, name = "weight") %>%
  ungroup()

最终edges的结果会是这样(展示连接次数):

from to weight
1 A B 2 # 在var1=1和var1=3里都出现了A-B组合
2 A D 2 # var1=1和var1=3里的A-D
3 B C 1 # var1=2里的B-C
4 B D 2 # var1=1和var1=3里的B-D
5 B E 1 # var1=3里的B-E
6 D E 1 # var1=3里的D-E

第三步:绘制网络图

直接用VisNetwork调用nodes和edges,还可以根据权重设置边的宽度,让连接强度更直观:

visNetwork(nodes, edges) %>%
  visEdges(arrows = "none", width = ~weight*2) %>% # 权重越高边越粗
  visOptions(highlightNearest = TRUE) # 鼠标悬停时高亮相邻节点

这样就能得到一张展示每个cat1类别之间,在不同var1分组里的连接强度的网络图啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:46:31