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

如何解析dplyr管道中group_by()与do()的输出结果

解析group_by()与do()组合后的iris分组summary结果

嘿,我来帮你拆解这个输出~你用group_by()加do()得到的是一个嵌套了summary对象的tibble,这是因为do()会把每个分组的运算结果打包成列表元素存在列里,咱们一步步来解析它:

先看懂输出结构

  • 这个tibble有3行,对应iris的3个物种,Species列是分组依据;
  • fn列是列表类型,每个元素都是summaryDefault对象——也就是对应物种的Petal.Width列执行summary()后的结果,只是没直接展开展示而已。

怎么提取里面的具体统计值?

有几种简单实用的方法:

1. 直接查看单个分组的结果

如果你想单独看某一个物种的summary细节,直接用列表索引就能调取:

# 查看setosa的Petal.Width统计结果
dat$fn[[1]]

执行后就能看到熟悉的summary输出:最小值、第一四分位数、中位数、均值、第三四分位数、最大值。

2. 把嵌套列表展开成整洁表格

用unnest_wider()函数可以直接把列表列拆成单独的统计量列,一步到位得到规整的结果:

library(tidyverse)
dat %>% unnest_wider(fn)

输出会变成一个3行6列的tibble,每列对应一个summary统计量,看起来非常直观。

3. 用map函数灵活处理

如果需要对每个summary对象做额外自定义处理,可以用purrr的map()函数先转成数据框,再展开:

dat %>% 
  mutate(fn = map(fn, ~as_tibble(t(.x)))) %>% 
  unnest(fn)

这种方式适合需要调整输出格式或添加额外逻辑的场景。

额外小贴士:更简洁的替代写法

其实在新版tidyverse里,不太推荐用do()来做这种分组统计了,用summarize()+across()可以直接得到展开的结果,不用处理嵌套列表:

iris %>% 
  as.tibble() %>% 
  group_by(Species) %>% 
  summarize(
    across(Petal.Width, 
           list(min = min, 
                q1 = ~quantile(.x, 0.25), 
                median = median, 
                mean = mean, 
                q3 = ~quantile(.x, 0.75), 
                max = max))
  )

这样输出的直接就是整洁的统计表格,更符合tidy数据的规范~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:54:04