如何用dplyr按组选择符合不同条件的首行?
更简洁的实现方法
可以利用dplyr的内置函数,通过一次分组操作完成需求,无需拆分数据框再合并,以下是两种简洁方案:
方案一:基于优先级排序的切片
set.seed(42) a <- rep(1:3, each = 3) b <- sample(c(0,1), size = 9, replace = T) c <- sample(1:9, size = 9, replace = F) df <- data.frame(a = a, b = b, c = c) df %>% group_by(a) %>% arrange(desc(b), desc(c), .by_group = TRUE) %>% slice(1) %>% ungroup()
逻辑说明
- 先按
b降序排序:让b=1的行优先排在组内最前面,确保有符合条件的行时优先选中这类数据 - 再按
c降序排序:在b=1的行里选c最大的,没有b=1的组则直接选组内c最大的 - 用
slice(1)直接取出每组排序后的第一行,完成筛选
方案二:利用权重值的slice_max
df %>% group_by(a) %>% slice_max(order_by = ifelse(b == 1, c + 1000, c), n = 1) %>% ungroup()
逻辑说明
- 给
b=1的行的c值加上一个足够大的固定值(比如1000,只要大于c的最大可能取值即可),人为拉高这类行的排序优先级 - 用
slice_max直接选出每组权重值最大的行,一次性满足需求
这两种方法都比原代码更简洁,且逻辑清晰易维护。
内容的提问来源于stack exchange,提问作者pvidal00
相关产品推荐
相关产品推荐

