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

如何将音乐流派调查数据转换为边列表以构建关联网络

二进制音乐偏好数据转边列表 + 构建igraph共现网络

以下是完整的实现步骤:

1. 加载依赖包与数据

先加载所需工具包,再读取你的调查数据:

# 加载必要包
library(igraph)
library(dplyr)

# 读取二进制偏好数据
music_data <- read.table(text = 
"GenreA GenreB GenreC 
PersonA 1 1 1
PersonB 1 1 0 
PersonC 1 1 0 
", header = TRUE)

2. 计算流派共现矩阵

核心是统计每对流派被同一用户同时喜爱的次数:

# 提取仅包含流派偏好的数值矩阵(去掉用户列)
genre_matrix <- as.matrix(music_data[, -1])

# 计算共现矩阵:交叉乘积得到两两流派的共同喜爱人数
cooccur_matrix <- t(genre_matrix) %*% genre_matrix

# 清除对角线(流派自身的共现无意义)
diag(cooccur_matrix) <- 0

生成的共现矩阵示例:

GenreA GenreB GenreC
GenreA      0      3      1
GenreB      3      0      1
GenreC      1      1      0

3. 转换为边列表

有两种方式可以得到边列表,按需选择:

方式1:直接用igraph从邻接矩阵生成网络

如果不需要单独导出边列表,可直接构建图对象:

# 从共现矩阵构建无向图,权重绑定共现次数
music_graph <- graph_from_adjacency_matrix(cooccur_matrix, mode = "undirected", weighted = TRUE)

# 查看边信息
E(music_graph)

方式2:手动生成边列表数据框

如果需要单独的边列表文件或数据框:

# 把共现矩阵转成表格格式
cooccur_df <- as.data.frame(as.table(cooccur_matrix))
colnames(cooccur_df) <- c("from", "to", "weight")

# 过滤无效边(权重为0)+ 去重无向图的重复边
edge_list <- cooccur_df %>% 
  filter(weight > 0) %>% 
  filter(from < to)

最终得到的边列表:

from    to weight
1 GenreA GenreB      3
2 GenreA GenreC      1
3 GenreB GenreC      1

4. 构建并可视化网络

用边列表或邻接矩阵构建的图对象,都可以直接可视化:

# 用边列表构建图(如果用方式1生成的graph可跳过这行)
music_graph <- graph_from_data_frame(edge_list, directed = FALSE)

# 可视化设置:边宽与共现次数挂钩
E(music_graph)$width <- E(music_graph)$weight * 2

# 绘制网络
plot(music_graph, 
     vertex.size = 20,
     vertex.label.cex = 1.2,
     edge.color = "gray",
     main = "音乐流派共现网络")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 07:26:36