如何让R中的flextable保留列表元素的原有名称?
解决flextable丢失列表元素名称的问题
你当前的代码通过索引遍历table_list,提取数据框时丢失了列表元素的名称(如A03.PREDIABETES),导致表格第一列默认显示为Var1。以下是两种可行的解决方法:
原数据
table_list<-list(A03.PREDIABETES = structure(list(Var1 = structure(1:2, levels = c("N", "Y"), class = "factor"), Freq = c(8L, 3L)), class = "data.frame", row.names = c(NA, -2L)), A03.GOITER = structure(list(Var1 = structure(1L, levels = "N", class = "factor"), Freq = 11L), class = "data.frame", row.names = c(NA, -1L)), A03.GESTATIONAL = structure(list(Var1 = structure(1:2, levels = c("N", "Y"), class = "factor"), Freq = c(9L, 2L)), class = "data.frame", row.names = c(NA, -2L)), A03.HASHIMOTO = structure(list(Var1 = structure(1L, levels = "N", class = "factor"), Freq = 11L), class = "data.frame", row.names = c(NA, -1L)), A03.THYROID = structure(list(Var1 = structure(1:2, levels = c("N", "Y"), class = "factor"), Freq = c(10L, 1L)), class = "data.frame", row.names = c(NA, -2L)), A03.HYPERTHYROID = structure(list(Var1 = structure(1:2, levels = c("N", "Y"), class = "factor"), Freq = c(10L, 1L)), class = "data.frame", row.names = c(NA, -2L)), A03.HYPOTHYROID = structure(list(Var1 = structure(1L, levels = "N", class = "factor"), Freq = 11L), class = "data.frame", row.names = c(NA, -1L)), A03.OTHER = structure(list(Var1 = structure(1:2, levels = c("N", "Y"), class = "factor"), Freq = c(10L, 1L)), class = "data.frame", row.names = c(NA, -2L)), A03.NONE = structure(list(Var1 = structure(1:2, levels = c("N", "Y"), class = "factor"), Freq = c(7L, 4L)), class = "data.frame", row.names = c(NA, -2L)))
原问题代码
library(data.table) library(tidyverse) library(dplyr) library(ggplot2) library(writexl) library(anytime) library(officer) library(flextable) # 创建Word文档 doc <- read_docx() # 向文档中添加表格 for (i in 1:length(table_list)) { df <- table_list[[i]] table <- flextable(df) table <- set_table_properties(table, width = .5) doc <- doc %>% body_add_flextable(table) } # 保存文档 print(doc, target = "report.docx")
方法1:将列表元素名称作为表格标题添加
遍历列表的名称而非索引,用set_caption把元素名称设为表格标题:
library(data.table) library(tidyverse) library(dplyr) library(ggplot2) library(writexl) library(anytime) library(officer) library(flextable) doc <- read_docx() # 遍历列表名称 for (name in names(table_list)) { df <- table_list[[name]] # 生成带标题的flextable table <- flextable(df) %>% set_table_properties(width = .5) %>% set_caption(caption = name) doc <- doc %>% body_add_flextable(table) } print(doc, target = "report.docx")
方法2:替换数据框列名为列表元素名称
把每个数据框的Var1列重命名为对应的列表元素名称:
library(data.table) library(tidyverse) library(dplyr) library(ggplot2) library(writexl) library(anytime) library(officer) library(flextable) doc <- read_docx() # 遍历列表名称 for (name in names(table_list)) { df <- table_list[[name]] # 重命名Var1列 colnames(df)[colnames(df) == "Var1"] <- name # 生成flextable table <- flextable(df) %>% set_table_properties(width = .5) doc <- doc %>% body_add_flextable(table) } print(doc, target = "report.docx")
两种方法都能保留原列表元素的名称,可根据展示需求选择:方法1适合将名称作为表格标题,方法2适合直接替换列名。
内容的提问来源于stack exchange,提问作者stephr
相关产品推荐
相关产品推荐

