如何解析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
相关产品推荐
相关产品推荐

