如何在dplyr中简洁地将函数向量输出分配给多列?
解决多长度向量输出的分组多列分配问题
直接用dplyr结合tidyr的组合操作就能搞定,完全不用手动加key再转宽格式,还能自动适配任意长度的函数输出:
基础示例(以range()为例)
拿mtcars数据集按cyl分组计算油耗的最小最大值,代码如下:
library(dplyr) library(tidyr) mtcars %>% group_by(cyl) %>% # 把每个组的range结果存为列表列 summarize(mpg_range = list(range(mpg))) %>% # 自动把列表列拆成多列,列名默认用原列名+下划线+索引 unnest_wider(mpg_range)
运行后会自动生成mpg_range_1(对应最小值)和mpg_range_2(对应最大值)两列,要是想自定义列名,给unnest_wider加个names参数就行:
mtcars %>% group_by(cyl) %>% summarize(mpg_range = list(range(mpg))) %>% unnest_wider(mpg_range, names = c("min_mpg", "max_mpg"))
适配任意长度的输出
如果你的函数返回长度为3的向量(比如同时返回均值、最小值、最大值),这个方法同样适用:
# 自定义返回3个值的函数 triple_stats <- function(x) c(mean(x), min(x), max(x)) mtcars %>% group_by(cyl) %>% summarize(stats = list(triple_stats(mpg))) %>% # 自定义列名对应3个输出值 unnest_wider(stats, names = c("mean_mpg", "min_mpg", "max_mpg"))
不管函数返回的向量是2个、3个还是更多元素,unnest_wider都会自动生成对应数量的列,完全不用手动调整重塑逻辑。
内容的提问来源于stack exchange,提问作者henhesu
相关产品推荐
相关产品推荐

