如何用简洁语法(优先tidyverse)合并结构相同的嵌套列表元素?
优雅合并结构一致的嵌套列表对应元素
问题场景
给定一个包含多个结构一致内层列表的嵌套列表,每个内层列表的元素为字符向量,需要将各内层列表的同名对应元素用c()函数合并,得到目标列表。
输入示例
input_list <- list( list(one = "a", two = "b", three = "c"), list(one = "d", two = c("e", "f"), three = "g") )
期望输出
list( one = c("a", "d"), two = c("b", "e", "f"), three = c("c", "g") )
解决方案
1. tidyverse 一行实现(优先推荐)
利用purrr包的transpose()翻转列表层级,再用map()批量调用c()合并元素:
library(tidyverse) input_list %>% transpose() %>% map(c)
原理说明:
transpose()将原嵌套列表的层级翻转,把所有内层列表中one、two、three这类同名元素分别聚合为子列表;map(c)对每个聚合后的子列表执行c()函数,完成元素的合并。
2. 基础R 一行实现
无需加载额外包,用do.call()配合Map()完成:
do.call(Map, c(f = c, input_list))
原理说明:
Map(c, ...)会按名称匹配输入列表的对应元素,逐个用c()合并;do.call()将input_list的所有内层列表作为参数传递给Map,实现批量处理。
内容的提问来源于stack exchange,提问作者TobiSonne
相关产品推荐
相关产品推荐

