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

基于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)。

原代码问题

你写的代码存在两个问题:

  1. 变量名错误:value应为values;
  2. 仅在匹配行返回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:55:20