Как можно автоматизировать добавление общих процентов к 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)