使用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
相关产品推荐
相关产品推荐

