从规整数据框生成节点与边数据框的技术问询
搞定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
相关产品推荐
相关产品推荐

