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

R语言dplyr按组筛选多列最大值结果不符,求排查解决

问题排查与解决:按分组筛选指定数值列最大值对应行的错误

错误根源

你使用的a:w列范围在dplyr中是按列名的字母顺序匹配,而非数据框的物理列顺序。你的数据框中Process(P)、RegionName(R)、Time(T)、Level(L)这些列名的首字母都落在a到w的字母区间内,因此被错误纳入了a:w的列集合中。其中Time列是日期/数值类型,其值会干扰a-w列的最大值计算,这正是导致c1、d1组结果不符合预期的原因。

比如c1组中,Time列的2010(日期转数值后会更大)远大于a-w列的16和129,which.max会优先选取第一个出现该最大值的行(XYZ_10),而非你期望的h列值为129的XYZ_11。

解决方法

需要明确指定仅选取物理顺序上的a到w列,或通过列名特征筛选目标数值列,避免包含无关列。以下是两种可靠的实现方式:

方法1:按物理列位置选取

根据你的测试数据,a列是第6列(前5列是type、Process、RegionName、Time、Level),因此可以直接选取从第6列到最后一列:

max_test <- test %>% 
  group_by(type) %>%
  # 计算每行a到w列的最大值
  mutate(row_max = pmax(across(6:ncol(.)), na.rm = TRUE)) %>%
  # 选取组内行最大值最大的行
  slice(which.max(row_max)) %>%
  # 移除临时计算列
  select(-row_max)

方法2:按列名特征选取(更鲁棒)

如果列名固定为单个字母a到w,可以直接匹配这些列名:

# 生成a到w的字母向量
target_cols <- letters[1:23] # a是第1位,w是第23位

max_test <- test %>% 
  group_by(type) %>%
  mutate(row_max = pmax(across(all_of(target_cols)), na.rm = TRUE)) %>%
  slice(which.max(row_max)) %>%
  select(-row_max)

说明

  • 使用pmax(across(...), na.rm = TRUE)计算每行目标列的最大值,确保忽略可能的NA值。
  • slice(which.max(row_max))选取组内该行最大值最大的记录,符合你的需求。
  • 两种方法都避免了无关列(如Time、Process)的干扰,确保仅计算a到w列的数值。

验证结果

应用上述代码后:

  • c1组会选取XYZ_11(h列129 > XYZ_10的l列16)
  • d1组会选取XYZ_16(h列961647 > 其他行的数值)

内容的提问来源于stack exchange,提问作者dmoyaec

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:43:03