是否使用tbl_cross在R的gtsummary中指定列?

uyhoqukh  于 2023-01-18  发布在  其他
关注(0)|答案(3)|浏览(126)

我使用@daniel-d-sjoberg的gtsummary包在R中创建了一个带有tbl_cross函数的交叉表,我试图弄清楚如何使用gtsummary指定输出列宽,以便修改表中第一列的宽度。我想利用gtsummary的格式设置选项,比如加粗和将表格标题分成两行(通过在modify_caption语句中指定“\n”)。问题是,我似乎无法将标题拆分为多行并指定列宽。我的出发点是使用以下代码,它将标题正确地拆分为两行:

library(tidyverse)
library(flextable)
library(gtsummary)

mytable <- iris %>% 
          mutate(Long.Petal = ifelse(Petal.Width > .2, "Yes", "No")) %>% 
        tbl_cross(
          row =  Long.Petal,
          col = Species,
          percent = "cell"
        ) %>% 
         modify_caption("This is line 1  \n  This is lin 2")

这将输出下表:

查看完文档后,我发现修改列宽的唯一方法是使用gtsummary的as_flex_table将表格转换为flextable,然后指定列宽。因此,为了做到这一点,我修改了上面的代码,通过添加两行代码将第一列的宽度更改为3英寸,如下面修改后的代码中的注解所示:

library(tidyverse)
library(flextable)
library(gtsummary)

mytable <-   iris %>% 
      mutate(Long.Petal = ifelse(Petal.Width > .2, "Yes", "No")) %>% 
    tbl_cross(
      row =  Long.Petal,
      col = Species,
      percent = "cell"
    ) %>% 
  modify_caption("This is line 1  \n  This is lin 2") %>% 
  as_flex_table() %>%   #NEW CODE LINE 1
  width(., 1, 3)        #NEW CODE LINE 2

mytable

这段代码生成下面的输出,它现在错误地将表标题的第1行和第2行放在了一行上。

是否有一种方法(最好是在gtsummary中使用tbl_cross或其选项)可以指定列宽并将表标题分隔为多行?

jtoj6r0c

jtoj6r0c1#

我们可以使用flextable中的set_caption

iris %>% 
    mutate(Long.Petal = ifelse(Petal.Width > .2, "Yes", "No")) %>% 
    tbl_cross(
        row =  Long.Petal,
        col = Species,
        percent = "cell"
    ) %>%    
    as_flex_table() %>%
    set_caption(caption = "This is line 1 <br/>This is line 2", 
      html_escape = FALSE)
  • 输出

jgwigjjp

jgwigjjp2#

在@akrun和@daniel-d-sjoberg提供了有用的建议后,我能够使用以下代码获得一个工作版本,并以四进制输出到Word:

---
title: "Untitled"
format: docx
editor: visual
#filters:
#  - docx-landscape.lua
---

```{r}
#| echo: false
#| message: false
library(tidyverse)
library(flextable)
library(gtsummary)
mytable <-   iris %>% 
      mutate(Long.Petal = ifelse(Petal.Width > .2, "Yes", "No")) %>% 
    tbl_cross(
      row =  Long.Petal,
      col = Species,
      percent = "cell"
    ) %>% 
  as_flex_table() %>%   #NEW CODE LINE 1
  width(., 1, 1) %>%         #NEW CODE LINE 2
set_caption(
   as_paragraph(
      as_chunk("caption  \n caption 2", props = fp_text_default(font.family = "Cambria"))
    ), word_stylename = "Table Caption")

mytable

这产生了:

![](https://i.stack.imgur.com/Rb1XJ.png)

感谢大家的帮助!

* * 更新**

在@TarJae的回答之后,我意识到这个解决方案不支持gtsummary包标题中的汇总统计。所以,我决定稍微修改一下这个解决方案,提供一个允许用户包含这些的解决方案。这可以通过以下方式完成:

library(gtsummary)
library(tidyverse)
library(flextable)
#| echo: false
mytemptable<-iris %>%
mutate(Long.Petal = ifelse(Petal.Width > .2, "Yes", "No")) %>%
tbl_cross(
row = Long.Petal,
col = Species,
percent = "cell"
) %>%
modify_caption("First Line of the Caption \n Second Line with the total sample size is {N}")

mytemptable %>%
as_flex_table() %>%
set_caption(
as_paragraph(
as_chunk(mytemptable$table_styling$caption[1], props = fp_text_default(font.family = "Cambria"))
), word_stylename = "Table Caption")


我在这里所做的就是首先使用gtsummary生成标签,然后将表转换为flextable,并从flextable生成的标题中拉入flextable标题(例如,在上面的示例中,mytemtable $table_styling $caption [1](https://i.stack.imgur.com/Rb1XJ.png))。
eivnm1vs

eivnm1vs3#

感谢@DanielD.Sjoberg的提示,现在我们可以这样做了。我们首先**必须使用as_gt()**将gt_summary tbl传输到gt对象(不仅gt()-〉这是行不通的),然后我们可以使用cols_width()函数:

选择正确色谱柱的另一个重要因素是:摘自@DanielD.Sjoberg上述评论:

  • “第一列名为label。您可以看到所有底层列名都带有show_header_names()。有许多隐藏列,因此我们可以通过索引号引用该列

请参见此处https://gt.rstudio.com/reference/cols_width.html

library(tidyverse)
library(gtsummary)
library(gt)

iris %>% 
  mutate(Long.Petal = ifelse(Petal.Width > .2, "Yes", "No")) %>% 
  tbl_cross(
    row =  Long.Petal,
    col = Species,
    percent = "cell"
  ) %>% 
  modify_caption("This is line 1  \n  This is lin 2") %>% 
  as_gt() %>% 
  cols_width(
    "label"~ px(250)
  )

相关问题