如何基于多列演员姓名DataFrame生成正确的邻接矩阵?
如何从多列演员数据生成全连接邻接矩阵
你的问题核心是要让同一行内的所有演员两两之间都建立边关系,而graph_from_data_frame(data)默认只会把前两列当作节点对处理,所以需要先把每行的演员转换成完整的两两边列表,再构建图生成邻接矩阵。
步骤1:构造示例数据(已有数据可跳过)
# 构造你提供的示例数据框 data <- data.frame( 演员1 = c("Mary", "Lucy", "Nicolas", "Angela"), 演员2 = c("Anna", "Sara", "rob", "Mary"), 演员3 = c("bob", "bob", NA, "Anna"), 演员4 = c("jack", "Alice", NA, NA), stringsAsFactors = FALSE )
步骤2:生成完整的演员边列表
library(igraph) # 逐行处理数据,生成所有两两演员对 edge_list <- do.call(rbind, apply(data, 1, function(row) { # 过滤当前行的NA值,得到有效演员列表 actors <- na.omit(row) # 当演员数量≥2时,生成所有无序两两组合 if (length(actors) >= 2) { combn(actors, 2, simplify = FALSE) %>% lapply(function(pair) data.frame(from = pair[1], to = pair[2], stringsAsFactors = FALSE)) %>% do.call(rbind, .) } else { # 演员数量不足2时返回空数据框 data.frame(from = character(0), to = character(0), stringsAsFactors = FALSE) } }))
步骤3:构建图并生成邻接矩阵
# 构建无向图(确保A-B和B-A视为同一条边) ig <- graph_from_data_frame(edge_list, directed = FALSE) # 生成邻接矩阵(sparse=FALSE返回普通矩阵,方便查看) adj_matrix <- get.adjacency(ig, sparse = FALSE)
结果说明
生成的adj_matrix是对称矩阵,其中adj_matrix[i,j] = 1表示演员i和演员j在同一行出现过(即存在边关系),0表示无关系。比如:
- Mary对应的行/列中,Anna、bob、jack、Angela的位置都会是1;
- bob对应的行/列中,Mary、Anna、jack、Lucy、Sara、Alice的位置都会是1。
内容的提问来源于stack exchange,提问作者Jina
相关产品推荐
相关产品推荐

