如何在完整tibble而非单行tibble上使用purrr::map
问题解决:让map函数识别完整分组tibble
错误原因分析
你用group_split()后得到的是多个tibble组成的列表,但pmap()的作用是遍历按列拆分的列表(每个元素对应一列的所有值)。当你给pmap()传入分组后的tibble列表时,它会把每个tibble的列当成独立参数传递给匿名函数,比如第一个分组tibble有5行,第二个有6行,执行tibble(...)时就会触发列尺寸不兼容的错误。
而直接对分组后的tibble用pmap(),它会按行拆分数据,每次传入一行的各列值,所以得到的是单行tibble的列表,这不是你想要的。
解决方案
方案1:用map()替代pmap()处理group_split()的结果
map()会把分组列表中的每个tibble作为单个参数传给函数,完美匹配你的需求:
library(tidyverse, quietly = T) ggplot2::diamonds %>% sample_n(30) %>% group_by(cut) %>% group_split() %>% map(function(data) { # 这里的data就是完整的分组tibble print(data) # 可以添加你的业务逻辑,比如绘图、统计等 })
或者更简洁的公式写法:
ggplot2::diamonds %>% sample_n(30) %>% group_by(cut) %>% group_split() %>% map(~{ print(.x) # 你的处理逻辑 })
方案2:用group_modify()直接处理分组数据(无需手动拆分)
如果不需要单独的列表结果,推荐用group_modify(),它会自动遍历每个分组,处理后合并成一个tibble:
ggplot2::diamonds %>% sample_n(30) %>% group_by(cut) %>% group_modify(function(data, keys) { # data是当前分组的完整tibble,keys是当前分组的分组键(比如cut的值) print(data) # 示例:返回每个分组的行数统计 tibble(group = keys$cut, row_count = nrow(data)) })
方案3:用nest_by()嵌套分组后再map()
先把每个分组嵌套成list列,再对list列用map()处理:
ggplot2::diamonds %>% sample_n(30) %>% nest_by(cut) %>% mutate(process_result = map(data, function(df) { print(df) # 你的处理逻辑,比如计算均值 tibble(avg_carat = mean(df$carat)) })) %>% unnest(process_result) # 可选:展开结果
内容的提问来源于stack exchange,提问作者jzadra
相关产品推荐
相关产品推荐

