R语言:如何快速用modelsummary处理模型列表列?
问题:使用modelsummary处理列表列的最优方式
我常用以下代码拟合模型:
mtcars %>% nest(-cyl) %>% mutate(model=map(data, function(x) lm(hp~mpg, data=x)), model2=map(data, function(x) lm(hp~mpg+wt, data=x)))->models library(tidyverse) models
由于models$model和models$model2是列表列,我原本以为modelsummary可以直接处理,但实际需要调整。
目前我用以下代码可以生成表格,但不知道如何对表格进行后处理(比如添加表头行):
models %>% pivot_longer(c(model:model2)) %>% select(value) %>% as.list() %>% map(., modelsummary,output="kableExtra", stars=T)
尝试后处理时出错:
models %>% pivot_longer(c(model:model2)) %>% select(value) %>% as.list() %>% map(., modelsummary,output="kableExtra", stars=T) %>% add_header_above(header=c(" "=1, "4"=2:3, "6"=4:5))
想请教使用modelsummary处理这类列表列的最快方法是什么?
解决方案
方法1:合并模型列表,一次性生成表格
不需要循环生成多个表格,直接提取所有列表列中的模型合并为一个列表,一次性传入modelsummary,生成单个表格后再做后处理:
library(modelsummary) library(tidyverse) library(kableExtra) # 提取所有模型并合并 all_models <- c(models$model, models$model2) # 自定义模型名称(方便区分分组和公式) model_labels <- paste0("cyl=", models$cyl, "_", rep(c("hp~mpg", "hp~mpg+wt"), each = nrow(models))) # 生成表格并添加表头 modelsummary(all_models, output = "kableExtra", stars = TRUE, model.names = model_labels) %>% add_header_above(header = c(" " = 1, "4缸组" = 2, "6缸组" = 2, "8缸组" = 2))
方法2:结合tidyverse数据整理与modelsummary分组参数
更贴合你的工作流,先把数据整理为每行对应一个模型的格式,再用modelsummary的group参数自动分组,后续直接做后处理:
models %>% pivot_longer(cols = c(model, model2), names_to = "模型公式", values_to = "模型对象") %>% mutate(分组 = paste("cyl=", cyl)) %>% modelsummary(模型对象, output = "kableExtra", stars = TRUE, group = 分组, model.names = 模型公式) %>% add_header_above(header = c(" " = 1, "4缸" = 2, "6缸" = 2, "8缸" = 2))
原代码出错原因
你用map生成的是多个独立的kableExtra表格组成的列表,而add_header_above只能作用于单个表格对象,因此会报错。上面两种方法均生成单个表格,可正常进行后处理操作。
内容的提问来源于stack exchange,提问作者spindoctor
相关产品推荐
相关产品推荐

