【问题标题】:How to build a two-way table summarizing a third variable in R (kable package)如何构建一个总结 R 中第三个变量的双向表(kable 包)
【发布时间】:2020-09-02 15:18:08
【问题描述】:

我正在使用 RMarkdown 并尝试使用 kable 包。我有一个三变量数据框:gender (factor)、age_group (factor) 和 test_score(scale)。我想创建以因子变量(性别和年龄组)作为表行和列的双向表,并将 test_scores 的汇总统计信息作为单元格内容。这些汇总统计数据是平均值、标准差和百分位数(中位数、第 1 个十分位数、第 9 个十分位数和第 99 个百分位数)。有没有一种简单的方法可以以一种漂亮的方式(比如使用 kable 包)构建这些表,而无需先将所有这些值输入到矩阵中?我搜索了 kable 帮助文件,但找不到如何操作。

# How my data looks like:

gender <- rep(c(rep(c("M", "F"), each=3)), times=3)
age <- as.factor(rep(seq(10,12, 1), each=6))
score <- c(4,6,8,4,8,9,6,6,9,7,10,13,8,9,13,12,14,16)
testdata <-data.frame(gender,age,score)


| gender | age | score |
|--------|-----|-------|
| M      | 10  | 4     |
| M      | 10  | 6     |
| M      | 10  | 8     |
| F      | 10  | 4     |
| F      | 10  | 8     |
| F      | 10  | 9     |
| M      | 11  | 6     |
| M      | 11  | 6     |
| M      | 11  | 9     |
| F      | 11  | 7     |
| F      | 11  | 10    |
| F      | 11  | 13    |
| M      | 12  | 8     |
| M      | 12  | 9     |
| M      | 12  | 13    |
| F      | 12  | 12    |
| F      | 12  | 14    |
| F      | 12  | 16    |

我想要一个如下所示的表格(但直接从我的数据集计算并具有漂亮的发布格式):

      Mean score by gender & age
|        | 10yo | 11yo | 12yo | Total |
|--------|:----:|:----:|:----:|:-----:|
| Male   |   6  |   7  |  10  |  7.7  |
| Female |   7  |  10  |  14  |  10.3 |
| Total  |  6.5 | 88.5 |  12  |   9   |

我尝试使用 kable 包,它确实为我提供了一些漂亮的表格(格式很好),但我只能用它生成频率表。但是我在其中找不到任何论据来选择变量摘要。如果有人建议使用更好的软件包来构建如上所述的表格,我将不胜感激。

kable(data, "latex", booktabs = T) %>%
   kable_styling(latex_options = "striped")

【问题讨论】:

  • 您希望每个汇总统计信息使用一个表吗?还是每个单元格中的所有这些统计数据?第二个选项似乎是一张杂乱无章的桌子。
  • 你好 LuizZ,欢迎来到 Stackoverflow。请阅读how to create a minimal reproducible example 并更新您的问题。如果您提供一个包含数据子集、您已经尝试过的代码以及对所需结果的解释的可重现示例,您将获得更好、更快的帮助。
  • 您好,Thomas 和 Len,感谢您的反馈。我将尝试使用可重现的示例更新我的问题,包括我的数据的虚构子集

标签: r cell summary kable kableextra


【解决方案1】:

如果没有可重现的示例,可以使用tables::tabular() 函数创建包含各种统计信息的多路表。

这是来自tables 文档第 38 页的示例,该示例说明了打印均值和标准差的表格中的多个变量。

set.seed(1206)

q <- data.frame(p = rep(c("A","B"),each = 10,len = 30), 
                a = rep(c(1,2,3),each = 10),
                id = seq(30),
                b = round(runif(30,10,20)),
                c = round(runif(30,40,70)))
library(tables)
tab <- tabular((Factor(p)*Factor(a)+1) ~ (N = 1) + (b + c) * (mean + sd),
               data = q)
tab[ tab[,1] > 0, ]

输出的 Stackoverflow 友好版本是:

          b           c          
 p a   N  mean  sd    mean  sd   
 A 1   10 14.40 3.026 55.70 6.447
   3   10 14.50 2.877 52.80 8.954
 B 2   10 14.40 2.836 56.30 7.889
   All 30 14.43 2.812 54.93 7.714
>

可以使用html() 函数将表格呈现为HTML。以下代码的输出在 HTML 浏览器中呈现时如下图所示。

html(tab[ tab[,1] > 0, ])

tables 包括计算其他统计数据的功能,包括分位数。有关分位数计算的详细信息,请参阅tables package manual 的第 29 - 30 页。

该软件包还适用于knitrkablekableExtra

【讨论】:

  • 非常感谢您的回答,Len!我正在寻找的正是这种类型的桌子。我已经投票给你的答案有用,但由于我在这里的“低声誉”,我的投票没有出现!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多