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

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))

两种写法结果完全一致,但官方函数有两个明显优势:

  1. 可读性更强:看到nth(mpg, 2)就知道是取第2个元素,而mpg[2]需要结合上下文的arrange才能明确意图,团队协作或后期维护时更清晰。
  2. 边界处理更灵活:如果某个分组的行数小于j,nth()可以通过default参数指定默认值(比如nth(mpg, 10, default = NA_real_)),而直接用索引会返回NA,需要额外处理。

总结

你的写法是有效的,但从代码可读性和健壮性角度,更推荐使用dplyr提供的first()/nth()/last()这类语义明确的函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:56:05