R gt summary_rows Соотношение Итоговая строка

Я использую отличный gt пакет, который поможет сделать красивые таблицы в R. Мне очень нравится, как я могу использовать его для создания столбцов Total, но я изо всех сил пытаюсь сделать что-нибудь, кроме простогоsum или mean. Мне нужно сделать что-то вроде СУММПРОИЗВ для пары моих столбцов. Допустим, у меня есть следующие данные. Оно имеетdenom столбец, на который я хочу разделить пару числителей.

library(dplyr)
library(gt)
set.seed(1)
df <- data.frame(some_letter = sample(letters, size = 10, replace = FALSE),
                 denom = sample(1:100, size = 10, replace = FALSE), 
                 num1 = sample(100:200, size = 10, replace = FALSE),
                 num2 = sample(100:200, size = 10, replace = FALSE)) %>% 
  mutate(rat1 = round(num1 / denom, 2), 
         rat2 = round(num2 / denom, 2))

some_letter denom num1 num2  rat1  rat2
1            y    54  188  119  3.48  2.20
2            d    74  143  127  1.93  1.72
3            g     7  178  200 25.43 28.57
4            a    73  132  143  1.81  1.96
5            b    79  183  186  2.32  2.35
6            k    85  134  169  1.58  1.99
7            n    37  169  139  4.57  3.76
8            r    89  173  197  1.94  2.21
9            w    94  141  124  1.50  1.32
10           j    34  137  195  4.03  5.74

Итак, я хотел бы получить TOTAL столбец, который является sum за denom, num1 а также num2. Это очень просто сgt используя summary_rowsфункция. НоTOTAL Мне нужно для двух столбцов соотношения не только это sum. Я не могу просто сложитьrat1 а также rat2чтобы получить правильное соотношение. ВTOTAL столбец для них должен быть sum(num1) / sum(denom) а также sum(num1) / sum(denom).

Так что это работает для простых столбцов.

gt(df) %>% 
  summary_rows(fns = list(TOTAL = "sum"), 
               columns = vars(denom, num1, num2)) 

Для этих других столбцов я безрезультатно пробовал следующее.

gt(df) %>% 
  summary_rows(fns = list(TOTAL = "sum"), 
               columns = vars(denom, num1, num2)) %>% 
  summary_rows(fns = list(TOTAL = ~sum(.) / sum(denom)), columns = vars(rat1, rat2))

gt(df) %>% 
  summary_rows(fns = list(TOTAL = "sum"), 
               columns = vars(denom, num1, num2)) %>% 
  summary_rows(fns = list(TOTAL = sum(.) / sum(denom)), columns = vars(rat1, rat2))

И я знаю, что могу вычислить это отдельно и rbind это на дно, но summary_rows Функция обеспечивает действительно фантастическое форматирование, не делая ничего лишнего.

2 ответа

Решение

У меня та же проблема, и я не нашел лучшего решения, кроме как навести порядок в прохождении кода. r1_total а также r2_total к summary_rows( ) функция:

r1_total <- sum(df$num1) /  sum(df$denom)
r2_total <- sum(df$num2) /  sum(df$denom)

gt(df) %>% 
  summary_rows(fns = list(TOTAL = "sum"), columns = vars(denom, num1, num2)) %>% 
  summary_rows(fns = list(TOTAL = ~ c(r1_total), columns = vars(rat1)) %>% 
  summary_rows(fns = list(TOTAL = ~ c(r2_total), columns = vars(rat2)) 

ИЛИ

gt(df) %>% 
  summary_rows(fns = list(TOTAL = "sum"), columns = vars(denom, num1, num2)) %>% 
  summary_rows(fns = list(TOTAL = ~ sum(df$num1) /  sum(df$denom) ), columns = vars(rat1)) %>% 
  summary_rows(fns = list(TOTAL = ~ sum(df$num2) /  sum(df$denom) ), columns = vars(rat2)) 

Это решение настолько плохое, что в нем должно быть написано пять "Да здравствует Мария" и 2 "Наши отцы", но оно работает...

Вы можете вычислить коэффициенты по отдельности, а затем бросить их в себя "fns"вызов. Похоже, нельзя просто удвоить, поэтому нужно разделить на sum(1). Ужасно наверняка и, вероятно, можно было бы немного очистить с помощью функции, но, похоже, это работает.

r1_total <- sum(df$num1) /  sum(df$denom)
r2_total <- sum(df$num2) /  sum(df$denom)

gt(df) %>% 
  summary_rows(fns = list(TOTAL = "sum"), 
               columns = vars(denom, num1, num2)) %>% 
  summary_rows(fns = list(TOTAL = ~ r1_total / sum(1) ), columns = vars(rat1)) %>% 
  summary_rows(fns = list(TOTAL = ~ r2_total / sum(1) ), columns = vars(rat2)) 

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