如何将节点颜色数据框合并到子图列表并计算紫色节点占比?
解决方案
我们可以通过数据展开+合并统计的方式实现需求,全程用data.table处理效率更高,具体步骤如下:
1. 转换初始节点数据格式
先把你已有的节点颜色数据转为data.table格式,并标记紫色节点:
library(data.table) original_node_dt <- as.data.table(original_node_data) original_node_dt[, is_purple := ifelse(Color == "purple", 1, 0)]
2. 遍历子图列表并统计
对subgraph_sets中的每一组子图结果,展开顶点列表、合并颜色数据后按分区统计:
# 遍历25次迭代结果 result_list <- lapply(seq_along(subgraph_sets), function(iter) { current_dt <- subgraph_sets[[iter]] # 展开分区的节点列表,得到节点-分区对应关系 expanded_dt <- current_dt[,.(node = unlist(vertices)), by = group] # 合并节点颜色标记 merged_dt <- expanded_dt[original_node_dt, on =.(node = Node)] # 按分区统计核心指标 stats_dt <- merged_dt[,.( total_nodes =.N, purple_nodes = sum(is_purple) ), by = group] # 添加迭代编号、调整列名和顺序 stats_dt[, `:=`( subgraph = iter, partition = group, percent_purple = round(purple_nodes / total_nodes * 100, 4), group = NULL )] setcolorder(stats_dt, c("subgraph", "partition", "total_nodes", "purple_nodes", "percent_purple")) return(stats_dt) }) # 合并所有迭代结果 final_result <- rbindlist(result_list)
3. 最终结果示例
运行后final_result将呈现你需要的格式:
subgraph partition total_nodes purple_nodes percent_purple <int> <int> <int> <int> <num> 1: 1 1 14 8 57.1429 2: 1 2 12 2 16.6667 3: 1 3 4 0 0.0000 4: 1 4 9 6 66.6667 5: 1 5 11 4 36.3636 --- 121: 25 1 13 3 23.0000 122: 25 2 6 6 100.0000 123: 25 3 9 0 0.0000 124: 25 4 8 5 62.5000 125: 25 5 14 6 42.8571
关键说明
unlist(vertices)是核心操作,把每个分区的节点列表展开成逐行的对应关系,为后续合并统计铺路- 利用
data.table的高效合并和分组计算能力,处理25次迭代的速度很快 - 百分比保留4位小数,可通过调整
round函数的第二个参数修改精度
内容的提问来源于stack exchange,提问作者farrow90
相关产品推荐
相关产品推荐

