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

使用dplyr按ID分组,满足条件时跨列查找最小值

解决方案:按ID分组条件筛选A列后取跨列最小值

核心思路

对每个ID分组,收集所有B列的值 + 仅age ≤5的A列的值,计算这些值的最小值,将结果填充到该ID的每一行。

dplyr实现代码

library(dplyr)

# 加载示例数据
df <- data.frame(id = c(1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3), 
                 age = c(4, 5, 7, 11, 4, 5, 20, 25, 26, 6, 7, 8, 9), 
                 A = c(0.2, 0.3, 0.5, 0.8, 0.2, 0.3, 1, 2, 3, 0.1, 0.3, 2, 3), 
                 B = c(0.1, 0.1, 0.1, 0.1, 0.3, 0.3, 0.3, 0.3, 0.3, 0.4, 0.4, 0.4, 0.4), 
                 C = c(0.1, 0.1, 0.1, 0.1, 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.4, 0.4, 0.4))

# 计算目标列
df <- df %>%
  group_by(id) %>%
  mutate(C_calculated = min(c(A[age <= 5], B))) %>%
  ungroup()

代码解释

  • group_by(id):按ID分组,确保后续计算仅在同一ID范围内进行
  • min(c(A[age <= 5], B)):
    • A[age <= 5]筛选当前ID下age≤5的A列值(无符合条件时返回空向量,不影响min计算)
    • 将筛选后的A值与当前ID下所有B值合并为一个向量,取最小值
  • ungroup():取消分组,避免后续数据操作受分组状态影响

验证结果

运行代码后,C_calculated列与期望的C列完全一致:

df %>% select(id, age, A, B, C, C_calculated)

输出:

# A tibble: 13 × 6
      id   age     A     B     C C_calculated
   <dbl> <dbl> <dbl> <dbl> <dbl>        <dbl>
 1     1     4   0.2   0.1   0.1          0.1
 2     1     5   0.3   0.1   0.1          0.1
 3     1     7   0.5   0.1   0.1          0.1
 4     1    11   0.8   0.1   0.1          0.1
 5     2     4   0.2   0.3   0.2          0.2
 6     2     5   0.3   0.3   0.2          0.2
 7     2    20   1     0.3   0.2          0.2
 8     2    25   2     0.3   0.2          0.2
 9     2    26   3     0.3   0.2          0.2
10     3     6   0.1   0.4   0.4          0.4
11     3     7   0.3   0.4   0.4          0.4
12     3     8   2     0.4   0.4          0.4
13     3     9   3     0.4   0.4          0.4

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 23:45:06