如何在R语言中对嵌套列表元素进行分组?求最优解决方案
R语言嵌套列表元素分组的最优解决方案
你想要把嵌套列表里各子列表的同名元素聚合到一起,比如把所有item1的值合并成一个向量,item2同理对吧?这里有两种高效的解决方案,分tidyverse和base R两种场景:
1. 最简洁的tidyverse方案(推荐)
用purrr包的transpose()函数,它专门用来转置嵌套列表——简单来说就是把原来按子列表分组的结构,转换成按元素名分组的结构,之后再把每个组里的元素合并成向量即可。
# 先准备原数据 nest1 <- list(item1 = 1, item2 = "a") nest2 <- list(item1 = 3, item2 = "b") li <- list(nest1, nest2) # 加载purrr(没安装的话先运行 install.packages("purrr")) library(purrr) # 转置列表并合并每个组的元素 result <- map(transpose(li), unlist)
运行后得到的结果正好符合你的预期:
> result $item1 [1] 1 3 $item2 [1] "a" "b"
2. Base R方案(无需额外包)
如果不想加载第三方包,用base R的嵌套lapply也能实现。思路是先获取子列表的元素名,然后遍历每个元素名,从所有子列表中提取对应元素并合并:
# 准备原数据(同上) nest1 <- list(item1 = 1, item2 = "a") nest2 <- list(item1 = 3, item2 = "b") li <- list(nest1, nest2) # 提取元素名并遍历聚合 result_base <- lapply(names(li[[1]]), function(nm) { unlist(lapply(li, "[[", nm)) }) # 给结果命名 names(result_base) <- names(li[[1]])
这个方案的输出和上面完全一致。
为什么你之前的lapply写法不行?
你尝试的lapply(li, "[[", c("item1", "item2"))有两个问题:
[[运算符一次只能提取单个元素,传入向量c("item1", "item2")不符合它的用法;- 这个写法的逻辑是遍历每个子列表,提取元素,而不是按元素名聚合所有子列表的对应元素,方向搞反了。
内容的提问来源于stack exchange,提问作者Florent
相关产品推荐
相关产品推荐

