R语言如何合并同名子列表元素并新增ID变量(优先purrr实现)
R嵌套列表按子项名重组的purrr最优实现
针对这个嵌套列表重组需求,最高效、鲁棒性最好的purrr方案如下,核心利用列表转置函数直接翻转嵌套层级,避免繁琐的手动位置索引:
library(purrr) l2 <- l |> # 第一步:给每个顶层分组下的子数据框追加来源ID列 imap(\(group_df, group_name) { map(group_df, \(df) data.frame(Value = df[[1]], ID = group_name)) }) |> # 第二步:翻转列表层级,将原内层的aa/bb/cc/dd转为顶层元素 list_transpose() |> # 第三步:按行合并同名称子项的所有数据 map(list_rbind)
实现逻辑
- 第一步用
imap遍历原列表l的顶层A/B/C分组:imap会自动将元素名称作为第二个参数传入函数,正好作为来源ID使用;内层嵌套map遍历每个分组下的aa/bb/cc/dd子数据框,将原本仅存单个数值的data.frame重构为包含Value(存原始数值)、ID(存来源分组名)两列的结构。 - 第二步调用
list_transpose()翻转嵌套列表层级:该函数会按子项名称匹配,将原本内层的aa/bb/cc/dd转为新列表的顶层元素,原结构l[["A"]][["aa"]]转置后会变为转置结果[["aa"]][["A"]],天然对齐目标列表的分组逻辑;即使原列表内子项存储顺序不一致,也会按名称正确匹配,不会出现数据错位,适配实际场景下的非规整数据。 - 第三步用
map搭配list_rbind()遍历转置后的顶层列表,将同属aa/bb/cc/dd的三个单行数据框按行合并,最终得到的l2和手动构建的目标结果完全一致。
注:如果使用的purrr版本低于1.0.0,没有内置
list_transpose和list_rbind,可以把对应位置替换为transpose()和dplyr::bind_rows(),实现逻辑完全一致。
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

