You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于多条件按组筛选对应值(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 00:17:35