如何在分组DataFrame中判断每组内高低值及对应group_id
解决方法:按pair_id分组识别value高低对应的group_id
嘿,这事儿用tidyverse工具链就能轻松搞定!针对你的需求,我准备了两种实用方案,你可以根据自己的场景选择:
方案一:汇总每个pair_id的高低group_id(含相等值处理)
这个方案会直接生成一个汇总表,清晰展示每个pair_id对应的高value、低value的group_id,还能处理两个value相等的情况:
library(tidyverse) # 你的原始数据 df <- tibble(pair_id = rep(1:5, each = 2), group_id = seq(1:10), value = c(0.6, 0.4, 0.5, 0.5, 0.2, 0.8, 0.3, 0.7, 0.5, 0.5)) # 生成汇总结果 result <- df %>% group_by(pair_id) %>% mutate( # 给每个组内的value降序排名,值相等则排名相同 value_rank = dense_rank(desc(value)), # 标记对应排名的group_id high_group = ifelse(value_rank == 1, group_id, NA), low_group = ifelse(value_rank == max(value_rank), group_id, NA) ) %>% summarise( # 合并同排名的group_id,去掉NA high_group = paste(na.omit(high_group), collapse = ", "), low_group = paste(na.omit(low_group), collapse = ", "), .groups = "drop" # 取消分组状态 ) # 查看结果 print(result)
运行后得到的结果:
# A tibble: 5 × 3 pair_id high_group low_group <int> <chr> <chr> 1 1 1 2 2 2 3, 4 3, 4 3 3 6 5 4 4 8 7 5 5 9, 10 9, 10
可以看到,对于pair_id=2和5这种两个value相等的情况,high_group和low_group会同时包含两个group_id,符合实际逻辑。
方案二:在原数据中标记每行的状态
如果你需要在原始数据框里直接标记每行属于“高value”、“低value”还是“相等”,可以用这个方案:
df_marked <- df %>% group_by(pair_id) %>% mutate( status = case_when( # 当组内max和min相等时,标记为equal max(value) == min(value) ~ "equal", value == max(value) ~ "high", value == min(value) ~ "low" ) ) %>% ungroup() print(df_marked)
运行结果:
# A tibble: 10 × 4 pair_id group_id value status <int> <int> <dbl> <chr> 1 1 1 0.6 high 2 1 2 0.4 low 3 2 3 0.5 equal 4 2 4 0.5 equal 5 3 5 0.2 low 6 3 6 0.8 high 7 4 7 0.3 low 8 4 8 0.7 high 9 5 9 0.5 equal 10 5 10 0.5 equal
这样每行的状态一目了然,处理相等值的逻辑也更明确。
内容的提问来源于stack exchange,提问作者Hristo Hristov
相关产品推荐
相关产品推荐

