1

我正在尝试使用 kableExtra / gt 包(或任何有效的)生成一个整洁的表,目标是让我的值列按不同的变量分组:

data <- data.frame(Name = c("Mary","Mary","Mary","Jane","Jane","Jane"),
                   Variables = c(letters[1:3],letters[1:3]),
                   Count = c(45, 76, 43, 23, 11, 46),
                   Percent = c(0.45, 0.56, 0.89, 0.65, 0.88, 0.91)) %>% arrange(Name, Variables)

# Desired output:
#             a              b               c
#       Count Percent | Count Percent | Count Percent
# Mary   45    45%       76    56%       43    89%
# Jane   23    65%       11    88%       46    91%    

我似乎不知道该怎么做,而我最接近的是:

library(gt)
gt(data, rowname_col = "Variables", groupname_col = "Name")

输出

我从本页显示的图表中获得灵感: 按年份变量分组的输出列表

谢谢你的帮助!

更新:根据 Stefan 的帖子解决:

data <- data.frame(Name = c("Mary","Mary","Mary","Jane","Jane","Jane"),
                   Variables = c(letters[1:3],letters[1:3]),
                   Count = c(45, 76, 43, 23, 11, 46),
                   Percent = c(0.45, 0.56, 0.89, 0.65, 0.88, 0.91)) %>% 
        arrange(desc(Name), Variables)

# Helper to put the columns in the right order
cols_order <- unlist(lapply(c("a", "b", "c"), function(x) paste(x, c("Count", "Percent"), sep = "_")))

data_wide <- data %>% 
        pivot_wider(names_from = "Variables", values_from = c(Count, Percent), names_glue = "{Variables}_{.value}") %>% 
        # Reorder columns
        select(all_of(c("Name", cols_order)))

data_wide %>% 
        gt(rowname_col = "Name") %>%
        tab_spanner_delim(delim = "_") %>%
        fmt_percent(ends_with("Percent"), decimals = 0)
4

2 回答 2

0

为了达到您想要的结果,您可以首先使用例如将您的数据重塑为宽格式tidy::pivot_wider。下一步是以正确的顺序放置列。为此,我重新排序了 df 的 cols 但这可能也可以通过gt. 剩下的就是设计表格。要分组,Variables您可以通过以下方式使用tab_spanner_delim并获得格式良好的百分比fmt_percent

编辑感谢@Shoesoff指出我的原始解决方案可以通过使用 oftab_spanner_delim而不是tab_spanner.

改进的答案

library(gt)
library(tidyr)
library(dplyr)

data <- data.frame(Name = c("Mary","Mary","Mary","Jane","Jane","Jane"),
                   Variables = c(letters[1:3],letters[1:3]),
                   Count = c(45, 76, 43, 23, 11, 46),
                   Percent = c(0.45, 0.56, 0.89, 0.65, 0.88, 0.91)) %>% 
  arrange(desc(Name), Variables)

# Helper to put the columns in the right order
cols_order <- unlist(lapply(c("a", "b", "c"), function(x) paste(x, c("Count", "Percent"), sep = "_")))

data_wide <- data %>% 
  pivot_wider(names_from = "Variables", values_from = c(Count, Percent), names_glue = "{Variables}_{.value}") %>% 
  # Reorder columns
  select(all_of(c("Name", cols_order)))

data_wide %>% 
  gt(data, rowname_col = "Name") %>% 
  tab_spanner_delim(
    delim = "_"
  ) %>% 
  fmt_percent(ends_with("Percent"), decimals = 0)

在此处输入图像描述

于 2021-01-09T12:18:58.140 回答
0

得到结果

data <- data.frame(Name = c("Mary","Mary","Mary","Jane","Jane","Jane"),
                   Variables = c(letters[1:3],letters[1:3]),
                   Count = c(45, 76, 43, 23, 11, 46),
                   Percent = c(0.45, 0.56, 0.89, 0.65, 0.88, 0.91))

v1 <- xtabs(cbind(Count, Percent) ~ Name + Variables, data)

重新组织数据:

Mary <- apply(v1[2,,], 1, c)
dim(Mary) <- NULL
Jane <- apply(v1[1,,], 1, c)
dim(Jane) <- NULL

使用 kable 创建表并使用 kableExtra 添加额外的标题。

require(knitr)
require(kableExtra)
add_header_above(kable(rbind(Mary, Jane), col.names = rep(c("Count", "Percent"), 3)),
                 c("", "a" = 2, "b" = 2, "c" = 2))

有两个标题的表

剩下的就是一些格式化来增加更多的空间和格式化百分比......

reprex 包(v0.3.0)于 2021-01-09 创建

于 2021-01-09T12:55:06.193 回答