如何用dplyr过滤R数据框:保留B大的行C值更小的A组?
使用dplyr实现指定数据过滤需求
当然可以用dplyr实现这个需求,核心思路是按A分组后,判断组内是否满足“B值较大的行的C值小于B值较小的行的C值”,再保留符合条件的组的所有行。
示例数据构造
先还原你的示例数据:
library(dplyr) df <- tibble( A = c(1, 1, 2, 2), B = c(2, 4, 2, 4), C = c(5, 6, 7, 6) )
简洁版过滤
直接在filter中完成组内条件判断:
result <- df %>% group_by(A) %>% filter(C[which.max(B)] < C[which.min(B)]) %>% ungroup()
执行后得到的结果就是你需要的:
print(result) #> # A tibble: 2 × 3 #> A B C #> <dbl> <dbl> <dbl> #> 1 2 2 7 #> 2 2 4 6
分步清晰版(适合理解逻辑)
如果需要更清晰的步骤,可以先通过mutate添加辅助列标记符合条件的组,再过滤:
result <- df %>% group_by(A) %>% mutate( # 提取组内B较小时的C值 c_small_b = C[which.min(B)], # 提取组内B较大时的C值 c_large_b = C[which.max(B)], # 标记该组是否满足需求 is_valid = c_large_b < c_small_b ) %>% filter(is_valid) %>% # 移除临时辅助列 select(-c_small_b, -c_large_b, -is_valid) %>% ungroup()
两种方法本质逻辑一致,都是利用group_by(A)将数据按A值分组,再通过which.min(B)和which.max(B)定位组内B值的大小对应的行,最后判断C值的关系来筛选组。
内容的提问来源于stack exchange,提问作者user3252986
相关产品推荐
相关产品推荐

