基于多条件按组筛选对应值(dplyr实现)
解决方案
核心思路
按SCR2.分组后分三步筛选:
- Name1:取组内
RANK 1最小(非NA)的名称 - Name2:在
RANK 2非NA且排除Name1的行中,取RANK 2最小的唯一名称 - Name3:在
RANK 2非NA且排除Name1、Name2的行中,取RANK 2最小的唯一名称
代码实现
先加载dplyr并构造数据框:
library(dplyr) df <- tibble::tribble( ~SCR2., ~name., ~`RANK 1`, ~`RANK 2`, ~`RANK 3`, "X.", "Lobatus", 1, NA, NA, "X.", "Panulirus", 2, NA, NA, "X.", "Lutjanus", 3, 1, 1, "X.", "Gerres", 4, 3, 4, "X.", "Ocyurus", 5, 2, 2, "X.", "Lutjanus", NA, NA, 3, "Y.", "Gesmurros", 1, 1, 2, "Y.", "Aricos", 2, 2, 1, "Y.", "Plonks", 3, 5, 3, "Y.", "Fibromos", 4, 8, 4, "Y.", "Snarkae", 5, 3, 6, "Y.", "Prontao", NA, NA, 5 )
执行分组筛选逻辑:
result <- df %>% group_by(SCR2.) %>% summarise( # 获取Name1:RANK1最小的名称 Name1 = (filter(., !is.na(`RANK 1`)) %>% arrange(`RANK 1`) %>% slice(1))$name., # 获取Name2:RANK2最小且不等于Name1的名称 Name2 = (filter(., !is.na(`RANK 2`), name. != Name1) %>% group_by(name.) %>% summarise(min_rank2 = min(`RANK 2`)) %>% arrange(min_rank2) %>% slice(1))$name., # 获取Name3:RANK2最小且不等于Name1、Name2的名称 Name3 = (filter(., !is.na(`RANK 2`), name. != Name1, name. != Name2) %>% group_by(name.) %>% summarise(min_rank2 = min(`RANK 2`)) %>% arrange(min_rank2) %>% slice(1))$name. )
运行结果
print(result) # # A tibble: 2 × 4 # SCR2. Name1 Name2 Name3 # <chr> <chr> <chr> <chr> # 1 X. Lobatus Lutjanus Ocyurus # 2 Y. Gesmurros Aricos Plonks
关键说明
- 处理
RANK 2时先按名称分组取最小RANK 2,避免同一名称多次出现干扰排序 - 每一步严格排除已选中的名称,确保三个名称唯一不重叠
内容的提问来源于stack exchange,提问作者jesspi
相关产品推荐
相关产品推荐

