【问题标题】:Trying to make a table in R where I group columns by variables of a vector试图在 R 中创建一个表,其中我按向量的变量对列进行分组
【发布时间】:2021-01-09 11:33:54
【问题描述】:

我正在尝试使用 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")

output

我从this page 中显示的图表中获得灵感: table with output columns grouped by year variable

感谢您的帮助!

更新:根据 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)

【问题讨论】:

    标签: r kable kableextra gt


    【解决方案1】:

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

    编辑感谢 @Shoesoff 指出我的原始解决方案可以通过使用tab_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)
    

    【讨论】:

    • 非常感谢,这太完美了!
    • 嗨 Stefan,根据您的代码,我在最后更改了一小部分,这应该使其对于具有更多名称变量的更大数据集更具可扩展性,并认为我会在这里分享:``` data_wide %>% gt(rowname_col = "Name") %>% tab_spanner_delim(delim = "_") %>% fmt_percent(ends_with("Percent"), decimals = 0) ```
    • 嗨,Shoesoff。感谢分享。这大大减少了代码。我将对我的答案进行编辑,以便对其他人更有用。最佳 S.
    【解决方案2】:

    得到结果

    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 package (v0.3.0) 于 2021-01-09 创建

    【讨论】:

    • 谢谢,这非常适合这个数据集!
    猜你喜欢
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 2023-03-16
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 2015-05-19
    相关资源
    最近更新 更多