R语言统计列表多元素数值对共现次数并生成对称矩阵的方法
R语言实现列表元素数值对共现次数统计与对称矩阵生成
直接给出两种可运行的实现方案,输出结果和你提供的示例完全一致:
方法1:基础R实现(无需额外安装包)
# 输入示例数据 myList <- list( a = c(2,4,6), b = c(1,2,3,4), c = c(1,2,5,7), d = c(1,2,4,5,8) ) # 提取所有唯一数值并排序,作为矩阵的行列索引 all_vals <- sort(unique(unlist(myList))) val_num <- length(all_vals) # 初始化全0对称矩阵 myMatrix <- matrix( data = 0, nrow = val_num, ncol = val_num, dimnames = list(all_vals, all_vals) ) # 遍历列表中的每个向量统计共现 for (vec in myList) { # 长度小于2的向量不存在数值对,直接跳过 if (length(vec) < 2) next # 生成当前向量所有不重复的两两组合 pair_mat <- combn(vec, 2) # 给矩阵对应位置计数+1 for (i in seq(ncol(pair_mat))) { v1 <- as.character(pair_mat[1,i]) v2 <- as.character(pair_mat[2,i]) myMatrix[v1, v2] <- myMatrix[v1, v2] + 1 myMatrix[v2, v1] <- myMatrix[v2, v1] + 1 } } # 查看结果 myMatrix
方法2:tidyverse风格简洁实现
library(tidyverse) # 输入示例数据 myList <- list( a = c(2,4,6), b = c(1,2,3,4), c = c(1,2,5,7), d = c(1,2,4,5,8) ) all_vals <- sort(unique(unlist(myList))) myMatrix <- myList %>% # 为每个向量生成两两组合,合并为数据框 map_dfr(~ as.data.frame(t(combn(.x, 2))), .id = "group") %>% # 统计每对数值的共现次数 count(V1, V2) %>% # 补全所有可能的数值对,无共现的填充为0 complete(V1 = all_vals, V2 = all_vals, fill = list(n = 0)) %>% # 转换为宽表矩阵 pivot_wider(names_from = V2, values_from = n) %>% column_to_rownames("V1") %>% as.matrix() # 补全矩阵下三角,保证对称 myMatrix[lower.tri(myMatrix)] <- t(myMatrix)[lower.tri(myMatrix)] # 查看结果 myMatrix
两种方案运行后输出的矩阵完全符合你给出的示例要求,对角线默认保持为0,对应同数值的共现次数不需要统计的需求。
内容的提问来源于stack exchange,提问作者Electrino
相关产品推荐
相关产品推荐

