Как можно автоматизировать добавление общих процентов к row_summary в пакете gt()?

В пакете 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) )

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) 

Создано 14.11.2020 с помощью пакета REPEX (v0.3.0)

Другие вопросы по тегам