Создание пользовательской суммы с помощью grand_summary_rows () - PullRequest
0 голосов
/ 10 января 2020

У меня есть таблица, которая выглядит следующим образом:

  category family       amount
  <chr>    <chr>        <chr> 
1 SALES    ONLINE SALES 47    
2 SALES    IN STORE     72    
3 COGS     LABOR        28    
4 COGS     TAXES        35    
5 COGS     WORKERS COMP 24    
6 COGS     BENEFITS     33    
7 EXPENSE  AUTOMOBILE   44    
8 EXPENSE  RENT         12    
9 EXPENSE  TELEPHONE    26    

Я пытаюсь создать таблицу GT из этого, поэтому я создал этот код:

library(tidyverse)
library(gt)

category <- c(rep("SALES",2),
              rep("COGS", 4),
              rep("EXPENSE",3)
)
family <- c("ONLINE SALES","IN STORE","LABOR","TAXES","WORKERS COMP","BENEFITS",
            "AUTOMOBILE", "RENT","TELEPHONE")

amount <- c(47,72,28,35,24,33,44,12,26)


output <- as_tibble(cbind(category,family,amount)) %>% 
    mutate(amount= as.numeric(amount)) %>% 
    gt(rowname_col = 'family',
       groupname_col = 'category') %>% 
    row_group_order(c("SALES","COGS", "EXPENSE")) %>% 
    summary_rows(groups = TRUE,
                 columns = 'amount',
                 fns = list(
                     Total = ~sum(.,na.rm = TRUE)
                 ))
output

Как вы получить общую сумму SALES-COGS-EXPENSE, используя функцию grand_summary_rows(), в то время как все суммы все еще положительные?

1 Ответ

1 голос
/ 14 января 2020

если я правильно понял ваш запрос, вы можете использовать код ниже:

output2 <- as_tibble(cbind(category,family,amount)) %>% 
           mutate(amount= as.numeric(amount)) %>% 
           gt(rowname_col = 'family', groupname_col = 'category') %>%
           summary_rows(groups = TRUE,
             columns = 'amount',
             fns = list(
             Total = ~sum(.,na.rm = TRUE)
             )) %>%  
           grand_summary_rows(
             columns = c("family","category","amount"),
             fns = list(
             "Grand Total" = ~sum(.,na.rm = TRUE)),
             formatter = fmt_number,
             use_seps = FALSE
            )

output2

enter image description here

###### ############# EDIT ###################

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

customFunc <- function(data) {

  salesSum <- sum(subset(data$`_data`[,c("amount")], category == 'SALES'))
  cogsSum <- sum(subset(data$`_data`[,c("amount")], category == 'COGS'))
  expenseSum <- sum(subset(data$`_data`[,c("amount")], category == 'EXPENSE'))

  return (salesSum - cogsSum - expenseSum)

}

data <- as_tibble(cbind(category,family,amount)) %>% 
  mutate(amount= as.numeric(amount)) %>% 
  gt(rowname_col = 'family', groupname_col = 'category')

output3 <- data %>%
  summary_rows(groups = TRUE,
               columns = 'amount',
               fns = list(
                 Total = ~sum(.,na.rm = TRUE)
               )) %>%  
  grand_summary_rows(
    columns = c("family","category","amount"),
    fns = list(
      "Grand Total" = ~customFunc(data)),
    formatter = fmt_number,
    use_seps = FALSE
  )

output3

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...