R语言:转换嵌套列表结构并写入Excel对应工作表的实现
需求背景与现有流程
1. 模拟数据
x1<-rnorm(5,1,1) x2<-rnorm(5,1,1) x3<-rnorm(5,1,1) x4<-rnorm(5,1,1) a<-rep("a",5) b<-rep("b",5) c<-rep("c",5) d<-rep("d",5)
2. 创建组合函数
定义creator函数,将x组向量与字母组向量两两组合为data frame并存储到list中:
vec<-c("x1", "x2","x3", "x4", "a", "b", "c", "d") creator <- function(vec) { # 识别不同组的向量 x_vecs <- grep("x", vec, value = TRUE) other_vecs <- setdiff(vec, x_vecs) # 初始化空列表存储输出数据框 out_list <- list() # 遍历两组向量的所有组合 for (x in x_vecs) { for (other in other_vecs) { # 将两个向量组合为数据框并命名 new_df <- data.frame(get(x), get(other)) names(new_df) <- c(x, other) new_name <- paste(x, other, sep = "") # 将新数据框加入输出列表 out_list[[new_name]] <- new_df } } # 返回输出列表 return(out_list) }
3. 构建嵌套列表
调用函数得到list l1,并提取元素构建按x值分组的嵌套列表listx1234:
l1<-creator(vec) View(l1) lx1<-l1[1:4] lx2<-l1[5:8] lx3<-l1[9:12] lx4<-l1[13:16] listx1234<-list(lx1,lx2,lx3, lx4) View(listx1234)
解决方案
1. 转换列表结构
通过展平嵌套列表、提取分组标识、重新分组的方式,实现列表结构转换:
# 展平嵌套列表,得到所有单个data frame的列表 flattened <- unlist(listx1234, recursive = FALSE) # 提取每个data frame名称中的字母后缀作为分组依据 groups <- sub("^x\\d", "", names(flattened)) # 按字母分组生成目标嵌套列表listfinal listfinal <- split(flattened, groups) # 查看结构验证结果 str(listfinal)
转换后listfinal的结构符合需求:每个子列表对应一个字母(a/b/c/d),包含该字母与所有x值组合的data frame。
2. 写入Excel文件
使用openxlsx包实现多工作表写入,步骤如下:
# 安装并加载包(首次使用需安装) # install.packages("openxlsx") library(openxlsx) # 创建空工作簿 wb <- createWorkbook() # 遍历listfinal,将每个子列表写入对应工作表 for (letter in names(listfinal)) { # 添加以字母命名的工作表 addWorksheet(wb, sheetName = letter) # 依次写入子列表中的每个data frame,各data frame间空一行分隔 start_row <- 1 for (df in listfinal[[letter]]) { writeData(wb, sheet = letter, x = df, startRow = start_row) start_row <- start_row + nrow(df) + 1 } } # 保存工作簿,覆盖已有文件 saveWorkbook(wb, "final_result.xlsx", overwrite = TRUE)
内容的提问来源于stack exchange,提问作者procerus
相关产品推荐
相关产品推荐

