R语言按lot分组后求取多列day字段最大值的实现方法
按地块分组计算多日洪水水位最大值的实现方案
问题说明
你现在有包含地块编号lot、3天洪水水位(day1/day2/day3,单位英寸)的数据集,需要按lot分组后分别计算每个分组下各日水位的最大值,输出每个lot对应各日最大值的精简数据集。
原有代码问题
你编写的代码存在两个核心问题:
- dplyr管道流中直接调用
df[which.max(df$day1),]是直接对原始全量数据集取子集,不会作用于group_by之后的分组 - 仅用
which.max取day1最大值对应的行,无法同时计算day2、day3各自的最大值,也没有处理NA值的情况
正确实现方案
方法1:tidyverse/dplyr方案(最简洁)
用summarise(across())批量对指定列计算最大值,同时设置na.rm = TRUE跳过NA值:
library(dplyr) df_slim <- df %>% group_by(lot) %>% summarise( across(starts_with("day"), ~max(.x, na.rm = TRUE)) ) %>% ungroup() # 不需要保留分组结构可加上
如果使用的dplyr版本较旧不支持across,可替换为summarise_at写法:
df_slim <- df %>% group_by(lot) %>% summarise_at(vars(starts_with("day")), ~max(., na.rm = TRUE)) %>% ungroup()
方法2:base R方案(无需加载第三方包)
用aggregate函数实现分组聚合:
df_slim <- aggregate( . ~ lot, data = df, FUN = function(x) max(x, na.rm = TRUE) )
输出验证
两种方法运行后得到的df_slim和预期结果完全一致:
> df_slim # A tibble: 5 × 4 lot day1 day2 day3 <chr> <dbl> <dbl> <dbl> 1 id-1 1.5 2.2 1.2 2 id-2 4 4.7 4 3 id-3 6.2 6.9 5.9 4 id-4 7 11.1 5.2 5 id-5 3.4 3.9 1.2
内容的提问来源于stack exchange,提问作者tchoup
相关产品推荐
相关产品推荐

