如何基于数据源优先级筛选各site各wyear的最大count值
按数据源优先级筛选并提取最大count值
我有一个大型DataFrame(示例如下),包含多来源数据。需要为每个site的每个wyear筛选最大count值,而数据源的可靠性存在差异,需先按优先级(kate > alan > mark > ron)选取对应wyear下最准确的数据源,再从该数据源中提取对应site和wyear的最大count值。
示例数据
wyear count site datasource 1 2018 5 A kate 2 2018 10 A alan 3 2020 20 A kate 4 2021 20 A kate 5 2021 5 A alan 6 2017 8 B mark 7 2018 89 B alan 8 2018 50 B mark 9 2019 49 B alan 10 2019 25 B mark 11 2019 35 B ron 12 2020 62 B alan 13 2018 20 C kate 14 2018 5 C mark 15 2018 8 C kate 16 2019 89 C mark 17 2020 50 C alan 18 2020 49 C mark 19 2021 25 C alan 20 2021 25 C kate
预期结果
wyear count site datasource 1 2018 5 A kate 3 2020 20 A kate 4 2021 20 A kate 6 2017 8 B mark 7 2018 89 B alan 9 2019 49 B alan 12 2020 62 B alan 13 2018 20 C kate 16 2019 89 C mark 17 2020 50 C alan 20 2021 25 C kate
现有代码
我已掌握按site和wyear取最大count的方法,但不知如何先按数据源优先级筛选,现有代码如下:
data1 <- data %>% group_by(site, wyear)%>% mutate(max.count.at.site = max(count))
解决方案
核心思路是先将datasource转换为有序因子来定义优先级,再分组筛选出最高优先级数据源的行,最后提取其中的最大count值。
步骤1:定义数据源优先级
将datasource列转为有序因子,指定优先级顺序(kate > alan > mark > ron):
# 为数据源指定优先级顺序 data$datasource <- factor(data$datasource, levels = c("kate", "alan", "mark", "ron"), ordered = TRUE)
步骤2:分组筛选并提取最大值
使用dplyr按site和wyear分组,先保留该组内优先级最高的数据源的所有行,再从中筛选出count最大的行:
library(dplyr) result <- data %>% group_by(site, wyear) %>% # 筛选当前组内优先级最高的数据源的行 filter(datasource == min(datasource)) %>% # 从这些行中提取count最大的记录(若有多个相同最大值,会全部保留) filter(count == max(count)) %>% ungroup()
代码说明
- 有序因子中,
min(datasource)会返回优先级最高的数据源(因为kate是第一个level,数值最小); - 两次
filter先锁定最高优先级数据源,再提取该数据源下的最大count,完全匹配预期结果。
内容的提问来源于stack exchange,提问作者Amanda Goldberg
相关产品推荐
相关产品推荐

