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

求基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 23:11:20