R语言如何高效合并列表中同名的数值向量元素
R列表同名元素合并的高效实现方案
首先给出可复现的示例数据构造代码:
par.list <- list( NAMEA = c(1,2,3,4,5,7,8,9,10), NAMEB = 6, NAMEB = c(11,12,13,16,17), NAMEA = c(14,15,18,19,20) )
方法1:基础R原生实现(无需额外依赖)
适合中小数据量,不需要安装任何第三方包,代码简洁:
merged.list <- lapply(split(par.list, names(par.list)), function(x) unname(unlist(x)))
逻辑说明:
- 用
split(par.list, names(par.list))将原列表按元素名称分组,得到的结果是每个组内包含所有同名的数值向量 - 用
lapply遍历每个分组,unlist将同组内多个向量拼接为单个向量,unname移除拼接后自动生成的元素名后缀
方法2:data.table实现(超大数据量最优)
适合作为倒排索引的超大列表场景,处理效率比基础R高3~10倍:
library(data.table) # 转换为data.table结构 dt <- data.table(name = names(par.list), val = par.list) # 按名称分组拼接,最终转为命名列表 merged.list <- dt[, .(val = list(unlist(val))), by = name][, setNames(val, name)]
方法3:tidyverse实现(语法友好)
适合习惯tidy语法栈的用户,可读性更高:
library(purrr) library(dplyr) merged.list <- par.list %>% split(names(.)) %>% map(unlist) %>% map(unname)
额外提示
如果合并后需要对数值向量去重,只需要在拼接后调用unique()即可,以基础R方法为例:
merged.list <- lapply(split(par.list, names(par.list)), function(x) unname(unique(unlist(x))))
内容的提问来源于stack exchange,提问作者Galvin Hoang
相关产品推荐
相关产品推荐

