如何用dplyr调整flextable的分组数据框行列结构
用dplyr调整grouped_data数据框结构适配flextable展示
问题背景
通过as_grouped_data()得到如下结构的grouped_data数据框:
df = structure(list(variable = c("something", NA, NA, NA), var = c(NA, "(Intercept)", "mutate1", "variable"), estimate = c(NA, 3.64770410229416, -0.230158472032055, -0.000692974348090823), std.error = c(NA, 0.88, 0.0831, 0.9315), statistic = c(NA, 0.1933, -0.5458, -0.613), df = c(NA, 67.03, 53.27, 58.285), p.value = c(NA, "<0.001", "0.80", "0.87")), row.names = c(NA, 4L), class = c("grouped_data", "data.frame"))
当前数据框展示形式:
variable var estimate std.error statistic df p.value 1 something <NA> NA NA NA NA <NA> 2 <NA> (Intercept) 3.6477041023 0.8800 0.1933 67.030 <0.001 3 <NA> mutate1 -0.2301584720 0.0831 -0.5458 53.270 0.80 4 <NA> variable -0.0006929743 0.9315 -0.6130 58.285 0.87
目前可以用以下代码生成flextable:
df %>% flextable %>% colformat_double(j = c('estimate','std.error', 'statistic','df'))
希望通过dplyr调整数据框结构,得到如下目标格式(数值已简化):
variable NA. NA NA NA NA 1 something <NA> <NA> <NA> <NA> <NA> 2 var estimate std.error statistic df p.value 3 (Intercept) 3.6 0.9 0.2 67 <0.001 4 mutate -0.2 0.1 -0.5 53.3 0.8 5 variable -0.2 0.9 0.6 53.3 0.87
需求要点:
- 把第一行的
something作为表头组名 - 将
var列转为第一列 - 后续列对应统计指标并格式化数值
- 空白列保持为空
解决方案
可以通过dplyr的行操作、列重组和数值格式化实现,步骤如下:
1. 拆分并处理各部分数据
library(dplyr) library(tibble) # 提取第一行的组名 group_name <- df$variable[1] # 处理统计数据行:过滤有效数据、格式化数值、重命名占位列 data_rows <- df %>% filter(!is.na(var)) %>% mutate(across(c(estimate, std.error, statistic, df), ~round(., 1))) %>% rename(` ` = variable) # 生成表头行:将原列名转为一行数据 header_row <- tibble( ` ` = "var", estimate = "estimate", std.error = "std.error", statistic = "statistic", df = "df", p.value = "p.value" ) # 生成组名行:保留组名,其余列设为NA group_row <- tibble( ` ` = group_name, estimate = NA_character_, std.error = NA_character_, statistic = NA_character_, df = NA_character_, p.value = NA_character_ )
2. 合并数据并设置目标列名
# 按顺序合并组名行、表头行、数据行 final_df <- bind_rows(group_row, header_row, data_rows) # 设置目标格式的列名 colnames(final_df) <- c("variable", "NA.", "NA", "NA", "NA", "NA")
3. 生成flextable(可选样式调整)
library(flextable) final_df %>% flextable() %>% bold(i = 1, bold = TRUE) %>% # 突出组名行 align(align = "center", part = "all") # 全局居中对齐
处理后的final_df完全匹配目标格式,数值已格式化,空白列保持为空。
内容的提问来源于stack exchange,提问作者12666727b9
相关产品推荐
相关产品推荐

