如何为sjPlot生成的多组lmer模型结果表格分配对应信号名标题
解决方案
你当前直接在lapply中传入整个title向量的写法,会让每一个表格都拿到完整的标题向量,无法实现一一对应赋值。你需要同时遍历模型列表models_list_2和标题向量,给每个模型单独匹配对应的标题。
第一步:预处理标题
先把标题调整为你需要的「Description of + 信号名」格式:
# 生成符合格式要求的标题向量 title_vec <- paste0("Description of ", title)
注意:你拟合模型时是按channel分组,channel的因子水平顺序和你提供的title向量顺序完全一致,因此标题和模型的顺序天然匹配,不需要额外调整。
第二步:使用双遍历函数替换原来的lapply
有两种常用实现方式,选你习惯的即可:
方法1:基础R的mapply实现
library(sjPlot) tables_models <- mapply( FUN = function(cur_model, cur_title) { tab_model( cur_model, show.ci = FALSE, show.se = TRUE, show.p = TRUE, show.stat = TRUE, show.df = TRUE, show.ngroups = TRUE, digits = 4, digits.p = 3, digits.re = 3, title = cur_title, string.pred = "Predictors", string.est = "Estimate", string.se = "std. Error", string.p = "Pr(>|t|)", string.df = "df", string.stat = "t-value", string.intercept = "(Intercept)", df.method = 'kr', p.val = 'kr', p.style = 'numeric_stars' ) }, cur_model = models_list_2, cur_title = title_vec, SIMPLIFY = FALSE # 保证返回结果是列表格式,和原来的lapply输出一致 ) %>% setNames(sort(unique(out_long$channel))) # 这里原代码写的是signals,属于笔误,按分组字段channel修正
方法2:tidyverse的purrr::map2实现
如果你习惯用tidyverse语法,写法更简洁:
library(sjPlot) library(purrr) tables_models <- map2( .x = models_list_2, .y = title_vec, .f = ~ tab_model( .x, show.ci = FALSE, show.se = TRUE, show.p = TRUE, show.stat = TRUE, show.df = TRUE, show.ngroups = TRUE, digits = 4, digits.p = 3, digits.re = 3, title = .y, string.pred = "Predictors", string.est = "Estimate", string.se = "std. Error", string.p = "Pr(>|t|)", string.df = "df", string.stat = "t-value", string.intercept = "(Intercept)", df.method = 'kr', p.val = 'kr', p.style = 'numeric_stars' ) ) %>% setNames(sort(unique(out_long$channel)))
内容的提问来源于stack exchange,提问作者12666727b9
相关产品推荐
相关产品推荐

