You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写高效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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 22:45:45