如何在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
相关产品推荐
相关产品推荐

