如何按日期筛选含ZDR列最大值对应的DataFrame整行数据?
用dplyr实现按分组提取ZDR列最大值对应的完整行数据
假设你的数据框名为df,包含DateHour分组列以及ZDR_1100、ZDR_1500等目标列,以下是基于dplyr的实现方案:
核心思路
按DateHour分组后,先计算每组内所有ZDR列的全局最大值,再定位到该最大值所在的完整行。如果存在多行对应同一最大值,可选择保留全部或仅一行。
代码实现
首先加载dplyr包:
library(dplyr)
方案1:保留所有符合条件的行(若有多个行ZDR列最大值等于组内全局最大值)
result <- df %>% group_by(DateHour) %>% mutate( # 计算当前组内所有ZDR列的全局最大值 group_max_zdr = max(c_across(contains("ZDR")), na.rm = TRUE), # 计算当前行所有ZDR列的最大值 row_max_zdr = max(c_across(contains("ZDR")), na.rm = TRUE) ) %>% # 筛选出当前行ZDR最大值等于组内全局最大值的行 filter(row_max_zdr == group_max_zdr) %>% # 删除临时生成的辅助列 select(-group_max_zdr, -row_max_zdr) %>% ungroup()
方案2:仅保留每组第一个符合条件的行
如果只需要每组的一行结果,在筛选后添加slice(1):
result <- df %>% group_by(DateHour) %>% mutate( group_max_zdr = max(c_across(contains("ZDR")), na.rm = TRUE), row_max_zdr = max(c_across(contains("ZDR")), na.rm = TRUE) ) %>% filter(row_max_zdr == group_max_zdr) %>% slice(1) %>% # 保留每组第一个匹配行 select(-group_max_zdr, -row_max_zdr) %>% ungroup()
关键说明
c_across(contains("ZDR")):批量选中所有列名包含"ZDR"的列,并转换为向量用于计算最大值na.rm = TRUE:处理数据中存在NA的情况,避免最大值计算返回NA- 如果你的列名匹配规则需要更精确(比如仅匹配开头为ZDR的列),可将
contains("ZDR")替换为starts_with("ZDR")
内容的提问来源于stack exchange,提问作者Mansi
相关产品推荐
相关产品推荐

