1

在 gt( ) 包中,row_summary( ) 函数很容易支持计算每次观察的平均百分比,但这与整体百分比分布不同。我想出了一个可行的解决方案(如下),但只能通过一次添加一列的总行百分比来实现。有没有办法“自动”添加这些总体百分比?

library(dplyr)
library(gt)

# Create test data
set.seed(1)
df <- tibble(some_letter = sample(letters, size = 10, replace = FALSE),
             num1 = sample(100:200, size = 10, replace = FALSE),
             num2 = sample(100:200, size = 10, replace = FALSE),
             n = num1 + num2) %>% 
      mutate(across(starts_with("num"), ~(.x)/(n), .names = "pct_{col}"))

# Use dplyr to calculate the correct overall totals and percentages [target]
df %>% 
  summarise_at(vars(num1, num2, n), funs(sum)) %>%
  mutate(across(starts_with("num"), ~(.x)/(n), .names = "pct_{col}"))

# Create table in gt( ), using a separate call to row_summary for each percentage
gt(df) %>% 
  summary_rows(fns = list(TOTAL = "sum"), columns = vars(num1, num2, n)) %>%
  summary_rows(fns = list(TOTAL = ~ sum(df$num1)/sum(df$n) ), columns = vars(pct_num1) ) %>%
  summary_rows(fns = list(TOTAL = ~ sum(df$num2)/sum(df$n) ), columns = vars(pct_num2) )
4

1 回答 1

0

我觉得你提出的解决方案是正确的。当您使用逐行函数时,您需要计算每一列的汇总结果。因此,您被迫使用summary_rows每一列 (pct_num1, pct_num2)。gt包的最大优点是您可以精确控制出现在摘要行的每个单元格中的值。作为一个缺点,它看起来很冗长。

在下面的代码中,使用一个最小的例子,我展示了同样的问题。我没有定义列来更清楚地n显示功能的使用。rowwise

library(dplyr)
library(gt)

df_ex <- tribble(
  ~group, ~num1, ~num2,
     "A",     4,     1,
     "B",     5,     5
  ) %>% 
  rowwise() %>% 
  mutate(
    across(starts_with("num"),
      ~ .x / sum(c_across(starts_with("num"))),
     .names = "pct{col}")) %>%
  ungroup()

df_ex
#> # A tibble: 2 x 5
#>   group  num1  num2 pctnum1 pctnum2
#>   <chr> <dbl> <dbl>   <dbl>   <dbl>
#> 1 A         4     1     0.8     0.2
#> 2 B         5     5     0.5     0.5

这些是将出现在摘要行中的值

df_ex %>% 
  summarise(num1 = sum(num1), num2 = sum(num2)) %>%
  rowwise() %>%
  mutate(pctnum1 = num1 / sum(c_across(starts_with("num"))), 
    pctnum2 = num2 / sum(c_across(starts_with("num"))))
#> # A tibble: 1 x 4
#> # Rowwise: 
#>    num1  num2 pctnum1 pctnum2
#>   <dbl> <dbl>   <dbl>   <dbl>
#> 1     9     6     0.6     0.4

作为使代码更具可读性的解决方案,在我看来,您可以定义函数来计算将出现在摘要行中的值。不过,此解决方案与您的解决方案相同,但有一些修饰(按行使用和摘要单元格的外部函数定义)。希望您觉得这个有帮助。

compute_f1 <- function(x, df) {
  sum(df$num1) / sum(df$num1+df$num2)
}

compute_f2 <- function(x, df) {
  sum(df$num2) / sum(df$num1+df$num2)
}

df_ex %>% 
  gt %>% 
  summary_rows(fns = list(TOTAL = "sum"), columns = vars(num1, num2),
    formatter = fmt_number, decimals = 0) %>%
  summary_rows(fns = list(TOTAL = ~ compute_f1(.x, df_ex)), columns = vars(pctnum1),
    formatter = fmt_number, decimals = 1) %>%
  summary_rows(fns = list(TOTAL = ~ compute_f2(.x, df_ex)), columns = vars(pctnum2),
    formatter = fmt_number, decimals = 1) 

reprex 包(v0.3.0)于 2020 年 11 月 14 日创建

于 2020-11-14T22:11:15.210 回答