大型数据集分组成对比较的高效实现方法咨询
问题:优化按分组生成ES成对比较的代码
数据集
Tab4 <- read.table(text = " nodepair `++` `--` `+-` `-+` `0+` `+0` `0-` `-0` `00` ES 1 A1_A1 0 4 0 0 0 0 0 0 16 3 2 A1_A1 0 5 0 0 0 0 0 0 16 4 3 A1_A1 0 5 0 0 0 0 0 0 15 5 ", header = TRUE)
原实现代码
用于按nodepair分组,对每个ES组进行成对比较:
ES_combs <- combn(unique(Tab4$ES), 2, simplify = FALSE) Tab5 <- Tab4 %>% ########### compare every pair to eachother group_split(nodepair) %>% map(.f = function(df) df %>% map(.x = 1:length(ES_combs), .f = ~df %>% filter(ES %in% ES_combs[[.x]]) %>% summarize(nodepair = first(nodepair), ES_1 = ES[1], ES_2 = ES[2], across(2:10, ~as.numeric(.))))) %>% bind_rows()
当前运行结果
Tab5 <- read.table(text = " nodepair ES_1 ES_2 `++` `--` `+-` `-+` `0+` `+0` `0-` `-0` `00` 1 A1_A1 3 4 0 4 0 0 0 0 0 0 16 2 A1_A1 3 4 0 5 0 0 0 0 0 0 16 3 A1_A1 3 5 0 4 0 0 0 0 0 0 16 4 A1_A1 3 5 0 5 0 0 0 0 0 0 15 5 A1_A1 4 5 0 5 0 0 0 0 0 0 16 6 A1_A1 4 5 0 5 0 0 0 0 0 0 15 ", header = TRUE)
存在的问题
- 处理大型数据集时运行速度极慢,嵌套的
map循环导致大量重复计算。 - 收到dplyr版本警告:
Warning messages:
1: Returning more (or less) than 1 row persummarise()group was deprecated in dplyr 1.1.0.
ℹ Please usereframe()instead.
ℹ When switching fromsummarise()toreframe(), remember thatreframe()always returns an ungrouped
data frame and adjust accordingly.
优化方案
优化思路
- 替换嵌套循环为向量化操作:用
dplyr的分组+组合生成替代嵌套map,避免循环带来的性能损耗。 - 解决警告问题:用
reframe()替代summarise()生成多行结果,符合dplyr新版本要求。
优化代码
library(dplyr) # 1. 按nodepair分组,生成每组内ES的所有两两组合 es_pairs <- Tab4 %>% distinct(nodepair, ES) %>% group_by(nodepair) %>% reframe( t(combn(ES, 2)) %>% as.data.frame() %>% setNames(c("ES_1", "ES_2")) ) # 2. 连接原表与组合表,提取对应行数据 Tab5_optimized <- Tab4 %>% inner_join(es_pairs, by = "nodepair") %>% filter(ES %in% c(ES_1, ES_2)) %>% # 整理列顺序,移除原ES列(与结果格式对齐) select(nodepair, ES_1, ES_2, `++`, `--`, `+-`, `-+`, `0+`, `+0`, `0-`, `-0`, `00`) %>% # 按组合排序,与原结果顺序一致 arrange(nodepair, ES_1, ES_2)
优化说明
- 性能提升:向量化的连接操作是dplyr底层优化过的,比嵌套循环效率高几个数量级,尤其适合大型数据集。
- 解决警告:用
reframe()生成多行组合结果,完全符合dplyr 1.1.0+的语法规范。 - 逻辑清晰:拆分组合生成与数据连接两步,代码更易维护和调试。
内容的提问来源于stack exchange,提问作者Hard_Course
相关产品推荐
相关产品推荐

