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

如何在dplyr中按组分配排名并将结果应用至全组

问题解决:dplyr分组后统一显示组内Top1和Top2颜色

需求:按day分组,对value字段降序分配排名,让每组内所有观测行都显示该组排名第1的top颜色和排名第2的second颜色。原代码仅对应排名行有值,其余为NA,需实现组内所有行的top和second值统一。

原代码

colour <- rep(c("blue", "red"), 3)
day <- rep(c("mon", "tues", "weds"), each = 2)
value <- sample.int(100, 6, TRUE)
dat <- tibble::tibble(colour, day, value)

library(dplyr)
dat %>%
  group_by(day) %>%
  mutate(rank=rank(-value)) %>%
  mutate(top = case_when(rank == 1~colour)) %>%
  mutate(second = case_when(rank == 2~colour))

修改后的代码

colour <- rep(c("blue", "red"), 3)
day <- rep(c("mon", "tues", "weds"), each = 2)
value <- sample.int(100, 6, TRUE)
dat <- tibble::tibble(colour, day, value)

library(dplyr)
dat %>%
  group_by(day) %>%
  mutate(rank = rank(-value)) %>%
  # 提取组内对应排名的颜色,自动填充到组内所有行
  mutate(
    top = colour[rank == 1],
    second = colour[rank == 2]
  )

关键说明

原代码用case_when仅为对应排名的行赋值,其余行保留NA。修改后通过colour[rank == 1]直接获取组内排名第1的颜色值,分组后该值为单个元素,会自动广播填充到组内所有行;同理colour[rank == 2]获取排名第2的颜色,实现组内所有行的top和second值统一。

期望输出

# A tibble: 6 × 6
# Groups:   day [3]
  colour day   value  rank top   second
  <chr>  <chr> <int> <dbl> <chr> <chr> 
1 blue   mon      34     1 blue  red   
2 red    mon      16     2 blue  red   
3 blue   tues     24     2 red   blue  
4 red    tues     36     1 red   blue  
5 blue   weds     87     1 blue  red   
6 red    weds     12     2 blue  red   

内容的提问来源于stack exchange,提问作者Gilrob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 10:25:15