如何将音乐流派调查数据转换为边列表以构建关联网络
二进制音乐偏好数据转边列表 + 构建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
相关产品推荐
相关产品推荐

