Перевернуть переменную group_by в столбцы, а столбцы - в строки dplyr - PullRequest
1 голос
/ 07 апреля 2020

заранее благодарю за ответ! Я работаю в Rstudio, пытаясь создать определенный формат таблицы c, который ищет мой клиент. В частности, я хотел бы показать каждый metri c как строку, а переменную group_by, в данном случае тип приложения, как столбец. Я использую group_by для консолидации всех моих данных по типу приложения, и я использую функцию суммирования для создания новых переменных.

subs <- data.frame(
  App_type = c('A','A','A','B','B','B','C','C','C','C'), 
  Has_error = c(1,1,1,0,0,1,1,0,1,1), 
  Has_critical_error = c(1,0,1,0,0,1,0,0,1,1)
)

Я могу сгруппировать представления вместе по типу приложения, чтобы просмотреть общее количество заявок с ошибками и общее количество критических ошибок. Вот что я сделал -

subs %>% 
group_by(App_type) %>% 
summarise(
  total_sub = n(), 
  total_error = sum(Has_error), 
  total_critical_error = sum(Has_critical_error)
)
# A tibble: 3 x 4
  App_type total_sub total_error total_critical_error
  <fct>        <int>       <dbl>                <dbl>
1 A                3           3                    2
2 B                3           1                    1
3 C                4           3                    2

Тем не менее, мой клиент хотел бы видеть это таким образом с итогами заявки.


                          A          B           C           TOTAL
1 total_sub               3          3           4           10
2 total_error             3          1           3           7
3 total_critical_error    2          1           2           5

1 Ответ

0 голосов
/ 07 апреля 2020

Мы можем повернуть в «широкий» формат после преобразования в «длинный», а затем изменить имя столбца «имя» на имя строки

library(dplyr)
library(tidyr)
library(tibble)
subs %>% 
  group_by(App_type) %>% 
  summarise(
     total_sub = n(), 
     total_error = sum(Has_error), 
     total_critical_error = sum(Has_critical_error))     %>% 
  pivot_longer(cols = -App_type) %>% 
  pivot_wider(names_from = App_type, values_from = value) %>%
  mutate(TOTAL =  A + B + C) %>%
  column_to_rownames("name")
#                      A B C TOTAL
#total_sub            3 3 4    10
#total_error          3 1 3     7
#total_critical_error 2 1 2     5

Или другой параметр transpose из data.table

library(data.table)
data.table::transpose(setDT(out), make.names = 'App_type',
      keep.names = 'name')[, TOTAL := A + B + C][]

, где out - суммарный результат ОП

out <- subs %>% 
        group_by(App_type) %>% 
        summarise(
          total_sub = n(), 
          total_error = sum(Has_error), 
          total_critical_error = sum(Has_critical_error)
          )

Или с base R

addmargins(t(cbind(total_sub = as.integer(table(subs$App_type)),
      rowsum(subs[-1], subs$App_type))), 2)
#                   A B C Sum
#total_sub          3 3 4  10
#Has_error          3 1 3   7
#Has_critical_error 2 1 2   5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...