基于tidyverse按站点和日期筛选最低Priority值的数据行
用tidyverse筛选站点-日期组合中优先级最高(数值最小)的记录
针对你的需求,用tidyverse里的dplyr工具可以轻松实现,核心思路是按Site和Date分组,然后保留每组中Priority最小的行,以下是两种常用方法:
方法1:使用slice_min直接取最小优先级行
slice_min可以直接在分组后提取指定数量的最小数值对应的行,参数with_ties控制是否保留同优先级的多条记录:
library(tidyverse) # 你的示例数据 df <- structure(list(Site = c(1L, 1L, 1L, 2L), Result = c(0.51, 0.55, 1.2, 4), Date = c("01.01.1999", "01.01.1999", "02.01.1999", "02.01.1999"), Priority = c(1L, 2L, 4L, 1L)), class = "data.frame", row.names = c(NA, 4L)) # 清理数据:每组保留Priority最小的1行,若有同优先级只留1条 df_cleaned <- df %>% group_by(Site, Date) %>% slice_min(Priority, n = 1, with_ties = FALSE) %>% ungroup() # 查看结果 print(df_cleaned)
方法2:使用filter筛选等于组内最小优先级的行
如果需要保留同一组内所有优先级相同且最小的记录,用这种方法更合适:
df_cleaned <- df %>% group_by(Site, Date) %>% filter(Priority == min(Priority)) %>% ungroup()
额外提示:处理日期格式
当前你的Date列是字符型,后续生成时序数据建议转成日期类型,用lubridate包即可:
df <- df %>% mutate(Date = lubridate::dmy(Date))
内容的提问来源于stack exchange,提问作者same11
相关产品推荐
相关产品推荐

