group_by后使用summarise选取分组第j行的方法是否正确?
关于group_by后用summarise取分组第j行的写法可行性
你的这种写法完全可行,但需要结合场景权衡是否使用。
为什么这个写法有效?
在dplyr中,经过group_by()分组后,summarise()里的变量会以分组内的向量形式存在。只要你已经通过arrange()给每个分组内的行排好了顺序,直接用another_variable[j]就能取到该分组中第j个位置的元素,完全匹配你“获取每个分组排名第j的行”的需求。
比如你的实验代码:
# 取每个分组第1行的mpg值 mtcars %>% arrange(cyl, mpg) %>% group_by(cyl) %>% summarise(answer = mpg[1])
输出结果:
# A tibble: 3 × 2 cyl answer <dbl> <dbl> 1 4 21.4 2 6 17.8 3 8 10.4
再比如取第2行:
mtcars %>% arrange(cyl, mpg) %>% group_by(cyl) %>% summarise(answer = mpg[2])
输出结果:
# A tibble: 3 × 2 cyl answer <dbl> <dbl> 1 4 21.5 2 6 18.1 3 8 10.4
和官方推荐写法的对比
官方推荐使用first()、nth()这类专门的函数,比如:
# 等价于mpg[1] mtcars %>% arrange(cyl, mpg) %>% group_by(cyl) %>% summarise(answer = first(mpg)) # 等价于mpg[2] mtcars %>% arrange(cyl, mpg) %>% group_by(cyl) %>% summarise(answer = nth(mpg, 2))
两种写法结果完全一致,但官方函数有两个明显优势:
- 可读性更强:看到
nth(mpg, 2)就知道是取第2个元素,而mpg[2]需要结合上下文的arrange才能明确意图,团队协作或后期维护时更清晰。 - 边界处理更灵活:如果某个分组的行数小于j,
nth()可以通过default参数指定默认值(比如nth(mpg, 10, default = NA_real_)),而直接用索引会返回NA,需要额外处理。
总结
你的写法是有效的,但从代码可读性和健壮性角度,更推荐使用dplyr提供的first()/nth()/last()这类语义明确的函数。
内容的提问来源于stack exchange,提问作者user2338823
相关产品推荐
相关产品推荐

