如何编写高效R代码移除含非唯一最大值的行?
提取数据框中仅含行内唯一最大值的行(高效实现)
需求明确:从数据框中筛选出每行最大值唯一的行,示例数据通过foo <- expand.grid(1:3,1:3,1:3)生成。原代码可行但依赖逐行循环,数据量大时效率低下,以下是更高效的实现方案:
Base R 向量化实现(推荐)
利用R的向量化内置函数替代循环,底层优化的操作能大幅提升速度:
# 生成示例数据 foo <- expand.grid(1:3, 1:3, 1:3) # 步骤1:计算每行的最大值 row_max <- apply(foo, 1, max) # 步骤2:统计每行中等于最大值的元素个数 max_count <- rowSums(foo == row_max) # 步骤3:筛选出最大值唯一的行 foo_filtered <- foo[max_count == 1, ]
另一种Base R实现(贴合原思路的优化)
和原代码逻辑一致,但用向量化操作替换循环:
winners <- max.col(foo) # 提取每行的最大值(通过行列索引匹配) max_vals <- foo[cbind(seq_len(nrow(foo)), winners)] # 检查每行最大值是否唯一 is_unique <- rowSums(foo == max_vals) == 1 foo_filtered <- foo[is_unique, ]
其他库实现(dplyr 风格)
如果习惯tidy语法,可使用dplyr实现,可读性更强:
library(dplyr) foo_filtered <- foo %>% rowwise() %>% mutate( max_val = max(c_across()), max_count = sum(c_across() == max_val) ) %>% filter(max_count == 1) %>% select(-max_val, -max_count)
效率说明
原代码的逐行循环在数据量较大时(比如10万行以上)会明显卡顿,而上述向量化方案依赖rowSums、apply这类底层优化函数,执行效率能提升数倍甚至数十倍。
内容的提问来源于stack exchange,提问作者Carl Witthoft
相关产品推荐
相关产品推荐

