R语言如何使用imap获取嵌套列表中子列表df的列数并正确索引df
嵌套列表层级对应关系
你的列表结构和imap遍历的参数对应关系如下,可直接按该规则定位子列表内的df:
- 第一层遍历对象:整个
lst1- 第一层
.y:受试者ID(如101-01-101) - 第一层
.x:对应该受试者的子列表,包含多个df
- 第一层
- 第二层遍历对象:第一层得到的
.x(单个受试者的子列表)- 第二层
.y:df的名称(如Demographics、DiseaseStatus) - 第二层
.x:你需要定位的单个dataframe
- 第二层
需求实现代码
1. 统计每个子列表中各df的列数
library(purrr) # 输出嵌套结构的列数统计结果,和原列表层级完全对应 col_count_result <- imap(lst1, function(subj_dfs, subj_id) { imap_int(subj_dfs, ~ ncol(.x)) })
运行后可直接查看对应受试者、对应表的列数,例如col_count_result$101-01-101$Demographics即可得到该表的列数3。
2. 修正导出Excel的代码
你原有逻辑正确,仅缺少第一层imap的输入对象,补充后即可正常运行:
library(purrr) library(openxlsx) imap(lst1, function(subj_dfs, subj_id) { wb <- createWorkbook() # 遍历当前受试者下的所有df写入工作表 imap(subj_dfs, function(df, sheet_name) { addWorksheet(wb, sheet_name) writeData(wb, sheet_name, df) setColWidths(wb, sheet_name, cols = 1:ncol(df), widths = "auto") }) # 保存单个受试者的Excel文件,overwrite参数控制文件已存在时是否覆盖 saveWorkbook(wb, file.path("C:/Users/", sprintf("subject_%s.xlsx", subj_id)), overwrite = TRUE) })
你提到的df特殊格式内容(第一行是字段说明、第二行是实际值)可以被
writeData直接完整写入,不需要额外转换处理。
内容的提问来源于stack exchange,提问作者Stataq
相关产品推荐
相关产品推荐

