如何为 html 和 pdf 创建加权、带标签的汇总表?

Posted

技术标签:

【中文标题】如何为 html 和 pdf 创建加权、带标签的汇总表?【英文标题】:How to create weighted, labelled summary tables for both html and pdf? 【发布时间】:2019-12-24 05:10:16 【问题描述】:

我想通过多个列变量创建包含多个行变量的汇总统计信息的大型交叉表 - 并找到了两个可以很容易地美化大型表的包:Duncan Murdoch 的 tables 包和 expss Gregory Demin 的包(它在桌子旁做了很多令人惊奇的事情)。还有一些其他的包,如moonBook(与同一作者的ztable 包一起使用),但据我所知,它们中的大多数都缺少我需要的东西:

我想……

    (可重复地)创建大型汇总表 这些汇总统计数据的用例权重 为变量使用变量和值标签 轻松创建 html 和 pdf 表格(无需更改功能选项/块选项)。

ad 1) tablesexpss 都可以轻松创建具有多行和多列变量的复杂表。作为示例,我们使用tablesexpss 中的表函数生成一个虹膜数据汇总表。

library(magrittr)  # Pipes %>% 

data(iris)  # Use iris data for examples

## Tables with the `tables` packages
library(tables)
tabular( (Species + 1) ~ (n=1) + Format(digits=2)*(Sepal.Length + Sepal.Width)*(mean + sd + Format(digits=0)*(n=1)), data=iris )

## Tables with the `expss` package
library(expss)
iris %>%
  tab_cells(Sepal.Length, Sepal.Width) %>% 
  tab_cols(Species, total()) %>% 
  tab_stat_mean_sd_n() %>% 
  tab_transpose() %>% 
  tab_pivot() 

ad 2) 使用 expss 可以轻松使用标签

iris_raw <- iris  # Save iris for later without any labels (they cause some problems with tabular)

iris <- apply_labels(iris,
                     Sepal.Length = "Sepal Length",
                     Sepal.Width = "Sepal With",
                     Species = "Species of Iris", 
                     Species = c("Setosa" = "setosa",
                                 "Versicolor" = "versicolor",
                                 "Virginica" = "virginica"))
str(iris)  # we can see the labels

library(expss)
expss_digits(digits = 2)
iris %>%
  tab_cells(Sepal.Length, Sepal.Width) %>% 
  tab_cols(Species, total()) %>% 
  tab_stat_mean_sd_n() %>% 
  tab_transpose() %>% 
  tab_pivot()

ad 3) 对于调查,我们通常需要案例权重,例如抽样设计权重、无响应权重、分层后权重 - 确定单个案例在描述性统计计算和模型估计中的权重。 expss 只需添加一行就可以使用案例权重:tab_weight(caseweight)

set.seed(123)  # Make following random numbers reproducible
iris$caseweight <- rnorm(nrow(iris), mean = 1, sd = .5) %>% abs() # Add some positive random caseweight to each case

library(expss)
expss_digits(digits = 2)
iris %>%
  tab_cells(Sepal.Length, Sepal.Width) %>% 
  tab_cols(Species, total()) %>% 
  tab_weight(caseweight) %>%  # Weight the cases
  tab_stat_mean_sd_n(weighted_valid_n = TRUE) %>% 
  tab_last_round(digits = 2) %>% 
  tab_transpose() %>% 
  tab_pivot() 

tables 中,也可以使用(自定义)函数来计算加权汇总统计,但不像expss 那样简单(我在这里可能错了——如果是这样,请纠正我)。

ad 4) 来到我的愿望清单的最后一点:html 和 pdf 表格。现在使用tables 很容易,使用expss 更难。在tables 中,函数toKable() 并将输出通过管道传送到kableExtra 以进一步完善是关键。

library(tables)
tab <- tabular( (Species + 1) ~ (n=1) + Format(digits=2)*(Sepal.Length + Sepal.Width)*(mean + sd + Format(digits=0)*(n=1)), data=iris_raw)
tab %>% 
  toKable() %>%  # Translates the tabular-object to a kable-object
  kable_styling(full_width = TRUE) %>%  # Functions from kableExtra
  column_spec(2, color = "red")


# Remark: in expss it's possible to transform the (html-) table output to a data frame via `split_table_to_df()`, s. https://***.com/questions/55542838/formatting-tables-in-r-markdown-to-export-to-ms-word-document/55576202#55576202
# But all the formatting gets lost - since it's just a df then.

library(expss)
expss_digits(digits = 2)
tab <- iris %>%
  tab_cells(Sepal.Length, Sepal.Width) %>% 
  tab_cols(Species, total()) %>% 
  tab_stat_mean_sd_n() %>% 
  tab_transpose() %>% 
  tab_pivot()

tab.df <- split_table_to_df(tab)  # Here the table 
str(tab.df)  # a df with the numbers and the labels
kable(tab.df)  # We could use kable on this (but the result does not look like a usual kable table) 

因此,这两个包中的每一个都有其超能力:expss 在创建带有标签和案例重量的表格方面做得非常出色,tables 可以轻松使用来自tabular() 的表格输出来创建 html 和 pdf表格通过 via toKable、kable 和 kableExtra - 并且因为 Hao Zhu 的 kableExtra 包根据被编织的文档类型生成 html 或 pdf - 这非常简单,无需更改任何代码(例如从“html”到“latex”),只需按 Knit to pdf/html - 效果非常好。

the rendered table for html

the rendered table in the pdf

问题:对于一个简单的可重复工作流程,最好同时拥有所有这些功能(1 到 4),从而将 expssknitrExtra 结合起来 - 有没有类似的功能toKable 用于来自 expss 的表(或更通用的 html 表),可以通过kableExtra 和简单的 html 和 pdf 导出进行改进,而无需更改任何可能的选项?还是有其他工作流程可以实现 1 到 4?感谢您的时间和任何提示!

【问题讨论】:

您可以通过tab_stat_fun 函数轻松使用expss 中的自定义函数。如果您使用权重,您的自定义函数应该有 weight 参数。至于 pdf 输出 - 现在还没有一个简单的解决方案。看来我会通过与flextable 包的集成来解决这个问题,但不会在最近的将来。 谢谢!我将尝试构建自定义函数,但目前意味着,sds 和频率是我所需要的。我玩过split_table_to_df(tab),发现它非常有帮助。我现在的工作流程是:我使用 expss -> split_table() -> kable() -> kableExtra 函数的表函数构建表 - 而且工作非常顺利。感谢您的出色工作@GregoryDe​​min 【参考方案1】:

另一个选择是使用来自 pander 包的pander。它可以识别来自split_table_to_df 的数据框,并为 PDF 文档生成漂亮的输出。

【讨论】:

谢谢 - 是的,绝对的:kablepander 都非常适合在 R markdown 中创建表格。 kable() 非常简单,kableExtra 非常适合编辑表格,例如添加行、突出显示单元格等等。 pander 开箱即用的功能要强大得多,并且内置了许多对象类的函数,而且似乎不仅仅可以做表格(而且它似乎与knitr::kable() 和cran.r-project.org/web/packages/pander/vignettes/knitr.html 一起工作得很好)。我去看看。

以上是关于如何为 html 和 pdf 创建加权、带标签的汇总表?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Scikit-learn 分类器添加加权损失?

如何为 google chrome adobe pdf 查看器指定参数?

如何为 iOS AppClips 创建 QR/NFC 标签

如何为带参数的交互式功能/命令创建Emacs键绑定?

如何为使用 Rotativa 生成动态内容的 PDF 生成页脚

如何为帖子创建类别标签?我正在使用 laravel 8