R语言对矩阵所有行组合应用函数计算公共与独有连接
R语言实现组件连接指标计算方案
核心实现思路
- 首先生成所有两两不重复的组件(行)组合,避免重复计算同一对组件的指标
- 对每一组的两个行向量,按给定逻辑计算公共连接数、两个组件各自的独有连接数
- 分别计算每对组件的两个C值,累加所有C值后除以总C值数量(每对贡献2个C值),得到总体通用指标
- 额外增加分母为0的异常判断,避免某组件无对应生产工作站时出现计算错误
完整代码实现
第一步:构造示例矩阵
# 构造你给出的示例矩阵 cm_mat <- matrix( c(1,0,1,1,1,1,1,1,0,0, 0,1,0,0,0,1,1,1,0,0, 1,0,0,1,1,0,1,0,0,1, 0,1,1,1,1,0,1,1,1,1, 1,0,0,1,0,0,0,1,0,1, 0,1,0,1,0,0,0,0,1,0, 0,1,1,1,1,1,1,0,1,1, 1,0,0,1,1,1,1,1,1,0, 1,0,0,1,1,1,0,1,1,0, 1,1,0,0,1,0,0,1,0,0), nrow = 10, byrow = TRUE, dimnames = list(paste0("CM",1:10), paste0("WS",1:10)) )
第二步:编写计算函数
calculate_c_metric <- function(mat) { n_row <- nrow(mat) # 生成所有不重复的两两行组合 pair_list <- combn(n_row, 2) total_c <- 0 for (idx in 1:ncol(pair_list)) { i <- pair_list[1, idx] j <- pair_list[2, idx] vec_i <- mat[i, ] vec_j <- mat[j, ] # 计算三个核心指标 common_conn <- sum(vec_i & vec_j >= 1) only_i <- sum(vec_i > 0 & vec_j == 0) only_j <- sum(vec_j > 0 & vec_i == 0) # 计算两个C值,避免分母为0 c_ij <- ifelse(common_conn + only_i == 0, 0, 100 * common_conn / (common_conn + only_i)) c_ji <- ifelse(common_conn + only_j == 0, 0, 100 * common_conn / (common_conn + only_j)) total_c <- total_c + c_ij + c_ji } # 计算总体平均C值 overall_avg <- total_c / (n_row * (n_row - 1)) return(overall_avg) }
第三步:运行验证
# 运行计算 overall_result <- calculate_c_metric(cm_mat) print(overall_result) # 验证CM1和CM2的单组计算是否符合示例 vec1 <- cm_mat["CM1", ] vec2 <- cm_mat["CM2", ] common <- sum(vec1 & vec2 >= 1) only1 <- sum(vec1 > 0 & vec2 == 0) only2 <- sum(vec2 > 0 & vec1 == 0) c12 <- 100 * common/(common + only1) c21 <- 100 * common/(common + only2) cat("CM1-CM2的平均C值为", mean(c(c12, c21)))
性能优化建议
如果你的矩阵行数很大(超过100行),可以将循环逻辑替换为向量化运算,直接通过矩阵乘法计算公共连接数矩阵,再批量计算独有连接数,运算效率会提升数倍。
内容的提问来源于stack exchange,提问作者svoxv
相关产品推荐
相关产品推荐

