基于dplyr实现按id分组匹配列时赋值新列的技术问题
问题:按ID分组,填充最小值对应的event值到整组
示例数据
library(dplyr) samp_df <- tibble(id= c("A", "A", "B", "B"), event= c(111, 112, 113, 114), values = c(23, 12, 45, 60), min_value = c(12, 12, 113, 113))
需求
按id分组,找到每组中values与min_value匹配的行对应的event值,将该值填充到新列event_with_min的所有组内行中,最终结果应为c(112, 112, 113, 113)。
原代码问题
你写的代码存在两个问题:
- 变量名错误:
value应为values; - 仅在匹配行返回
event,其余行留空为NA,未将匹配值广播到整组。
# 原错误代码(语法+逻辑问题) samp_df <- samp_df %>% group_by(id) %>% mutate(event_with_min = if_else(min_value == value, event, NA_integer_)
最优dplyr解决方案
方案1:组内直接提取匹配值(最简洁)
利用分组后向量索引的特性,直接取出组内符合条件的event值,dplyr会自动将该值填充到整组的每一行:
samp_df <- samp_df %>% group_by(id) %>% mutate(event_with_min = event[values == min_value]) %>% ungroup()
方案2:筛选匹配行后合并(适合复杂场景)
先筛选出每组中匹配条件的行,提取id和对应的event值,再通过左连接合并到原数据框:
# 提取每组最小值对应的event min_event_map <- samp_df %>% filter(values == min_value) %>% select(id, event_with_min = event) # 合并到原数据 samp_df <- samp_df %>% left_join(min_event_map, by = "id")
两种方案最终都能得到目标结果:
# A tibble: 4 × 5 id event values min_value event_with_min <chr> <dbl> <dbl> <dbl> <dbl> 1 A 111 23 12 112 2 A 112 12 12 112 3 B 113 45 113 113 4 B 114 60 113 113
内容的提问来源于stack exchange,提问作者pd441
相关产品推荐
相关产品推荐

