使用 R "tables" 包的带有累计计数/百分比和组总数的漂亮表格

Pretty tables with cumulative count / percentage and group totals using R "tables" package

我正在尝试生成一个格式化的 html table,其中包含频率列、累积频率列、列百分比和累积列百分比。 table 还应该让数据通过分组变量进行子集化,并包括分组总数。

我几乎可以使用 dplyr 和 tidyr 的组合来实现这一点,但输出是一个看起来不太漂亮的数据帧。我想知道使用 tables::tabulate 命令是否有更简单的方法?

# Sample data
dat <- data.frame(
  id = 1:100, 
  group = factor(sample(c("A", "B"), 100, replace = TRUE)),
  sessions = factor(sample(1:10, 100, replace = TRUE))
)

# dplyr/tidyr solution
library(dplyr)
library(tidyr)
dat %>% 
  group_by(group, sessions) %>% 
  tally() %>% 
  spread(key = group, value = n) %>% 
  mutate(All = rowSums(.[-1])) %>% 
  gather(key = group, value = n, -sessions) %>% 
  group_by(group) %>% 
  mutate(
    cum_n = cumsum(n),
    p = round(n / sum(n)*100,1),
    cum_p = round(cum_n / sum(n)*100,1),
  ) %>% 
  data.frame() %>% 
  reshape(timevar = "group", idvar = "sessions", direction = "wide")

# As far as I get using tables::tabulate
library(tables)
tabular(
  Factor(sessions, "Sessions") ~ 
    (Heading()*group + 1) * 
    (
      (n = 1) + 
        # (cum_n = ??) +
        Heading("%")*Percent(denom = "col")*Format(digits = 2) 
        # + Heading("cum_%")*??*Format(digits = 2)
      ),
  data = dat
)

我建议使用 knitr::kablekableExtra,它们是制作表格的绝佳软件包。您还可以将其设置为多种格式输出,例如使用相同的代码为 pdf.

生成 htmllatex
library(dplyr)
library(tidyr)
library(knitr)
library(kableExtra)

dat %>% 
  group_by(group, sessions) %>% 
  tally() %>% 
  spread(key = group, value = n) %>% 
  mutate(All = rowSums(.[-1])) %>% 
  gather(key = group, value = n, -sessions) %>% 
  group_by(group) %>% 
  mutate(
    cum_n = cumsum(n),
    p = round(n / sum(n)*100,1),
    cum_p = round(cum_n / sum(n)*100,1),
  ) %>% 
  data.frame() %>% 
  reshape(timevar = "group", idvar = "sessions", direction = "wide") %>%
  kable("html") %>%
  kable_styling(bootstrap_options = c("striped", "hover"))