Сводная таблица Excel с R (с добавлением итогов и%) вместо счетчиков - MRE включено - PullRequest
1 голос
/ 23 марта 2020

Я пытаюсь воссоздать сводную таблицу в R (как вывод, который я получаю из Excel). Пока мой код выглядит так:

id <- c(1,2,3,4,5)
reason <-  c("A","A","A","B","B")
type <- c("1. Small","1. Small","1. Mid","1. Mid","1. Small")

df <- data.frame(id,reason,type)
df2 <- df %>% group_by(reason, type) %>% summarise(count = n()) %>% ungroup()
df3 <- df2 %>% dcast(type ~ reason, value.var = "count")

В результате df3 подсчитывает количество и ожидаемую структуру, но мне не хватает общего столбца и%. Таким образом, ожидаемый результат должен быть:

type     Total   A     B
1. Small 60%     66%   50%
2. Mid   40%     33%   50%

Но вместо этого я получаю:

type      A     B
1. Small  2     1
2. Mid    1     1

Можно ли настроить код для получения ожидаемого результата? или в R отсутствует еще одна функция?

Thx!

Ответы [ 2 ]

1 голос
/ 23 марта 2020

С tidyverse

library(dplyr)
library(tidyr)
df %>%
   count(reason, type) %>%
   group_by(type) %>%
   mutate(prop = 100 *n/sum(n), Total = 100 * sum(n)/sum(.$n)) %>% 
   select(-n) %>% 
   ungroup %>% 
   pivot_wider(names_from = reason, values_from = prop)
# A tibble: 2 x 4
#  type     Total     A     B
#  <fct>    <dbl> <dbl> <dbl>
#1 1. Mid      40  50    50  
#2 1. Small    60  66.7  33.3

Или с data.table

library(data.table)
dt1 <- setDT(df)[, .N, .(reason, type)]
dcast(dt1[, c('prop', 'Total') := .(100 * N/sum(N), 
   100 * sum(N)/sum(dt1$N)), type], type + Total ~ reason, value.var = 'prop')
#      type Total        A        B
#1:   1. Mid    40 50.00000 50.00000
#2: 1. Small    60 66.66667 33.33333
0 голосов
/ 23 марта 2020

попробуйте сделать это

library(tidiverse)
xtabs(count ~ type + reason, df2) %>% 
addmargins(margin = 2) %>% 
prop.table(margin = 2) %>% 
round(digits = 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...