如何合并列表中同class标识的嵌套tibble数据列?
按Class合并嵌套Tibble列表的解决方案
需求说明
现有列表b,其每个元素均为包含class标识列与嵌套tibble列data的tibble。需要按class标识合并所有列表元素中的对应数据列,将同一class下的datatibble进行行绑定,且代码需适配数量未知的多列表元素。此前使用b |> reduce(inner_join, by = "class")会将data列拆分为多列,无法实现需求。
原代码示例
a = list( mtcars %>% as_tibble() %>% select(mpg, cyl, disp) |> sample_n(5), mtcars %>% as_tibble() %>% select(mpg, cyl, disp) |> sample_n(5) ) b = a %>% map(~ mutate(.x, class = floor(runif(nrow(.x), 0, 2)))) %>% map(~ nest(.x, -class))
解决方案代码
library(tidyverse) # 合并列表b的所有元素,按class分组后绑定对应data列 result <- b %>% bind_rows() %>% group_by(class) %>% summarise(data = list(bind_rows(data)), .groups = "drop")
代码解释
bind_rows():将列表b中的所有tibble纵向拼接,把分散在各个列表元素里的class和data行整合到同一个tibble中。group_by(class):按class字段分组,确保同一class的所有datatibble被归为一组。summarise(data = list(bind_rows(data))):对每个分组,用bind_rows()将组内所有嵌套的datatibble合并为一个,再用list()包裹以保持嵌套结构;.groups = "drop"用于取消分组状态,得到最终的扁平化分组结果。
此方案无需提前知道列表b的元素数量,可适配任意多的列表元素。
内容的提问来源于stack exchange,提问作者philipp
相关产品推荐
相关产品推荐

