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
相关产品推荐
相关产品推荐

