如何高效快速地重新打包R语言列表?
R语言高效重新打包列表的实现方法
你需要将现有列表L1、数据框ref和变量type重新打包成指定结构的嵌套列表,以下是几种高效的实现方法:
原始输入代码
L1 <- list( df1 = data.frame( a = c(1,2,3), b = c(4,7,1), c = c(2,7,9)), df2 = data.frame( a = c(3,3,8), b = c(1,0,3), c = c(4,6,2)), df3 = data.frame( a = c(3,8,5), b = c(4,7,4), c = c(2,4,8)) ) ref <- data.frame(id = c("df1", "df2", "df3")) type <- "char"
期望输出结构
super_list <- list( body1 = list( row = L1[["df1"]], ref = ref[1], type=type), body2 = list( row = L1[["df2"]], ref = ref[2], type=type), body3 = list( row = L1[["df3"]], ref = ref[3], type = type))
实现方法
方法1:基础R(无需额外包)
利用lapply遍历索引生成子列表,最后为父列表命名,轻量高效:
# 生成每个body元素 super_list <- lapply(seq_along(L1), function(i) { list(row = L1[[i]], ref = ref[i, , drop = FALSE], type = type) }) # 为列表元素设置名称 names(super_list) <- paste0("body", seq_along(L1))
注:
ref[i, , drop = FALSE]确保返回结果为数据框结构,与期望输出中的ref[1]保持一致。
方法2:使用purrr包(代码更简洁)
如果习惯tidyverse风格,purrr::map2可以同时遍历列表元素和对应索引,代码更紧凑:
library(purrr) super_list <- map2(L1, seq_along(L1), function(df, i) { list(row = df, ref = ref[i, , drop = FALSE], type = type) }) %>% set_names(paste0("body", seq_along(.)))
方法3:data.table包(大数据场景优化)
若处理的列表规模较大,data.table的操作逻辑在性能上更有优势:
library(data.table) super_list <- lapply(seq_along(L1), function(i) { list(row = L1[[i]], ref = ref[i, , drop = FALSE], type = type) }) setattr(super_list, "names", paste0("body", seq_along(L1)))
以上方法均可高效生成目标嵌套列表结构,可根据场景选择:基础R方法无依赖适合轻量需求;purrr代码易读性更强;data.table更适配大规模数据处理场景。
内容的提问来源于stack exchange,提问作者Roman Zubariev
相关产品推荐
相关产品推荐

