如何对齐命名的tibble/数据框列表并插入至Excel工作表或工作簿?
对齐命名Tibble列表并导出到Excel的解决方案
我来帮你搞定这个对齐命名列表并导出到Excel的需求!咱们一步步来,先补全你示例里的ldf_cab定义,再分两种场景处理:
先补全示例代码
首先把你没写完的ldf_cab补好,这样咱们的测试数据就完整了:
library(tidyverse) library(XLConnect) # 第一个命名tibble列表 a <- tibble(x = 1:10, y = 11:20, z = 21:30) b <- tibble(x = 1:10, y = 11:20, z = 21:30) c <- tibble(x = 1:10, y = 11:20, z = 21:30) ldf_abc <- list(a,b,c) names(ldf_abc) <- c("a", "b", "c") # 第二个命名tibble列表(名称顺序不同) c <- tibble(n = 1:10, o = 11:20, p = 21:30) a <- tibble(n = 1:10, o = 11:20, p = 21:30) b <- tibble(n = 1:10, o = 11:20, p = 21:30) ldf_cab <- list(c, a, b) names(ldf_cab) <- c("c", "a", "b")
第一步:对齐两个命名列表
因为两个列表的元素名称是一致的,只是顺序不同,咱们可以通过名称匹配来对齐它们:
# 获取两个列表共有的元素名称(确保只处理双方都有的数据) common_names <- intersect(names(ldf_abc), names(ldf_cab)) # 按名称提取对应元素,得到对齐后的配对列表 aligned_pairs <- map(common_names, ~ list(abc_df = ldf_abc[[.]], cab_df = ldf_cab[[.]])) names(aligned_pairs) <- common_names
这样aligned_pairs里的每个元素都是一对同名的tibble,比如aligned_pairs$a就包含来自ldf_abc的a和来自ldf_cab的a。
场景1:将对齐后的配对数据存入对应名称的Excel工作簿
也就是每个名称对应一个单独的Excel文件,文件里包含两个工作表,分别存放来自两个列表的对应数据:
# 遍历每一对对齐的数据,导出到单独的Excel工作簿 walk(common_names, function(name) { # 创建新的Excel工作簿(如果不存在则自动创建) wb <- loadWorkbook(paste0(name, "_data.xlsx"), create = TRUE) # 取出当前名称对应的两个tibble df_abc <- ldf_abc[[name]] df_cab <- ldf_cab[[name]] # 添加第一个工作表,标记来源 createSheet(wb, name = "来自ldf_abc") writeWorksheet(wb, df_abc, sheet = "来自ldf_abc", startRow = 1, startCol = 1) # 添加第二个工作表,标记来源 createSheet(wb, name = "来自ldf_cab") writeWorksheet(wb, df_cab, sheet = "来自ldf_cab", startRow = 1, startCol = 1) # 保存工作簿 saveWorkbook(wb) })
执行完后,你会得到a_data.xlsx、b_data.xlsx、c_data.xlsx三个文件,每个文件里有两个工作表对应各自来源的数据。
场景2:将所有对齐后的数据存入同一个Excel工作簿的不同工作表
如果希望把所有数据都放在一个Excel文件里,每个工作表对应一个来源的某个名称数据:
# 创建一个总的Excel工作簿 wb_total <- loadWorkbook("all_aligned_data.xlsx", create = TRUE) # 遍历所有共同名称,添加对应的工作表 walk(common_names, function(name) { # 添加来自ldf_abc的工作表,命名格式为「名称_来源abc」 sheet_abc <- paste0(name, "_来自ldf_abc") createSheet(wb_total, name = sheet_abc) writeWorksheet(wb_total, ldf_abc[[name]], sheet = sheet_abc) # 添加来自ldf_cab的工作表,命名格式为「名称_来源cab」 sheet_cab <- paste0(name, "_来自ldf_cab") createSheet(wb_total, name = sheet_cab) writeWorksheet(wb_total, ldf_cab[[name]], sheet = sheet_cab) }) # 保存总工作簿 saveWorkbook(wb_total)
这样你会得到一个all_aligned_data.xlsx文件,里面包含a_来自ldf_abc、a_来自ldf_cab等6个工作表,清晰区分每个数据的来源和名称。
小提示
如果XLConnect因为Java环境出问题,你可以换成openxlsx包(不需要Java依赖),用法类似,只需要把loadWorkbook、createSheet、writeWorksheet换成openxlsx对应的函数即可,比如createWorkbook、addWorksheet、writeData。
内容的提问来源于stack exchange,提问作者Nicholas Hayden
相关产品推荐
相关产品推荐

