求基于8列字符串数据集生成weighted adjacency matrix的R代码
R实现:生成带食材名称的加权共现邻接矩阵
实现步骤与代码
下面的代码会处理8列食材数据集,统计两两食材的共现次数作为权重,最终输出以食材名称为行/列名的邻接矩阵,完全适配你已有的网络图代码。
1. 准备数据(替换为你的真实数据集)
# 模拟示例数据集:8列,每行是一个食谱的食材(空值表示未使用) set.seed(123) all_ingredients <- c("鸡蛋", "面粉", "牛奶", "黄油", "糖", "盐", "酵母", "巧克力", "香草精", "抹茶粉") df <- as.data.frame(matrix(sample(c(all_ingredients, NA), 80, replace = TRUE, prob = c(rep(0.09, 10), 0.1)), ncol = 8)) colnames(df) <- paste0("ingredient_", 1:8)
2. 生成共现统计并构建邻接矩阵
# 加载必要包 library(dplyr) # 提取每行的非空食材,生成两两组合 row_ing <- apply(df, 1, function(x) na.omit(x)) co_pairs <- lapply(row_ing, function(x) { if (length(x) >= 2) t(combn(sort(x), 2)) # sort保证组合顺序一致,避免重复计数 }) %>% do.call(rbind, .) %>% as.data.frame() # 统计每对食材的共现次数 co_counts <- co_pairs %>% group_by(V1, V2) %>% summarise(weight = n(), .groups = "drop") # 创建空的邻接矩阵,用食材名称命名行/列 unique_ings <- unique(c(co_counts$V1, co_counts$V2)) adj_matrix <- matrix(0, nrow = length(unique_ings), ncol = length(unique_ings), dimnames = list(unique_ings, unique_ings)) # 填充矩阵(双向赋值,保证对称) for (i in 1:nrow(co_counts)) { adj_matrix[co_counts$V1[i], co_counts$V2[i]] <- co_counts$weight[i] adj_matrix[co_counts$V2[i], co_counts$V1[i]] <- co_counts$weight[i] }
3. 验证与使用
# 查看矩阵片段 adj_matrix[1:5, 1:5] # 直接传入你的网络图代码即可,节点名称会自动保留 # 示例:如果用igraph生成图 # library(igraph) # g <- graph_from_adjacency_matrix(adj_matrix, mode = "undirected", weighted = TRUE) # plot(g, vertex.label = V(g)$name) # 节点显示食材名称
关键细节
- 避免重复计数:用
sort(x)生成组合,确保A-B和B-A被视为同一对,不会重复统计 - 空值处理:
na.omit()自动过滤每行的空列,只保留实际使用的食材 - 节点名称绑定:通过
dimnames直接为邻接矩阵设置行/列名,后续可视化时无需额外转换,直接显示食材名称 - 对称矩阵:共现关系是双向的,因此同时填充矩阵的上下三角,保证邻接矩阵符合无向图的要求
内容的提问来源于stack exchange,提问作者AMM
相关产品推荐
相关产品推荐

