Вычисление Dplyr, когда кросс-таблицы имеют более двух групп - PullRequest
0 голосов
/ 29 января 2019

Dplyr действительно отлично работает с наборами данных, и я думаю, что я могу заменить все манипуляции с данными, которые я всегда делал в Excel, с помощью команд dplyr.Однако при работе с несколькими подгруппами сложно вычислить промежуточные итоги и проценты, и я не нашел никакого связанного кода в моем недавнем поиске по этой теме здесь.

Пожалуйста, проверьте следующую таблицу.Все работает нормально, но потратив больше дня, я все еще не понимаю, как выполнить последний расчет: итоги для каждой страны, cH, EC, GT, MX и США.

Subtotals

Я буду рад, если некоторые из экспертов, которых мы только что здесь найдем, могут помочь мне в этом процессе.

Это код и структура данных, если вы хотитевоспроизвести всю среду.

Спасибо.

library(tidyverse)
data %>% group_by(Q7_MoEd, add=TRUE) %>% 
  mutate(educ_levels_count = n()) %>% 

  #how many countries we are dealing with
  group_by(Country, add=TRUE) %>% 
  mutate(country_count = n()) %>% 

  #lets add how many education levels we have
  group_by(Q7_MoEd, Country, educ_levels_count, country_count, add=TRUE) %>% 
  summarise(
    educ_count = n(), 
    educ_percentage = round(educ_count/first(educ_levels_count),2), 
    #country_percentage = educ_count/first(country_count), 
  ) %>% 
  mutate(n_percentage = paste0(educ_count," (",educ_percentage,"%)")) %>% #merge variables
  select(Q7_MoEd, Country, n_percentage, educ_levels_count) %>% 
  spread(Country, n_percentage, fill="-") %>% 
  janitor::adorn_totals("row")



data <- structure(list(Q7_MoEd = structure(c(6L, 3L, 3L, 5L, 5L, 5L, 
                                             5L, 5L, 5L, 5L, 5L, 3L, 5L, 6L, 5L, 5L, 5L, 6L, 5L, 5L, 5L, 2L, 
                                             6L, 6L, 6L, 5L, 5L, 5L, 5L, 6L, 5L, 6L, 2L, 6L, 6L, 6L, 6L, 5L, 
                                             4L, 5L, 6L, 6L, 5L, 5L, 5L, 5L, 5L, 6L, 1L, 5L, 5L, 6L, 5L, 6L, 
                                             5L, 6L, 6L, 6L, 5L, 6L, 6L, 5L, 3L, 5L, 5L, 5L, 6L, 5L, 5L, 6L, 
                                             5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 5L, 5L, 4L, 5L, 3L, 5L, 2L, 6L, 
                                             5L, 5L, 3L, 3L, 6L, 5L, 2L, 5L, 5L, 6L, 5L, 6L, 4L, 6L, 5L, 3L, 
                                             5L, 6L, 5L, 6L, 6L, 5L, 3L, 5L, 5L, 4L, 5L, 6L, 5L, 2L, 5L, 6L, 
                                             5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 3L, 5L, 6L, 5L, 5L, 1L, 5L, 6L, 
                                             5L, 5L, 5L, 6L, 5L, 5L, 3L, 5L, 5L, 5L, 5L, 4L, 6L, 5L, 6L, 5L, 
                                             5L, 5L, 6L, 2L, 5L, 3L, 6L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
                                             5L, 5L, 5L, 5L, 5L, 5L, 3L, 5L, 4L, 5L, 5L, 5L, 5L, 5L, 6L, 5L, 
                                             5L, 3L, 5L, 5L, 6L, 5L, 5L, 5L, 6L, 5L, 6L, 5L, 3L, 5L, 4L, 5L, 
                                             5L, 3L, 6L, 6L, 3L, 4L, 4L, 2L, 3L, 5L, 5L, 3L, 5L, 3L, 5L, 6L, 
                                             5L, 5L, 5L, 5L, 6L, 6L, 4L, 5L, 5L, 5L, 3L, 5L, 5L, 5L, 3L, 5L, 
                                             3L, 6L, 5L, 3L, 5L, 3L, 5L, 5L, 5L, 5L, 3L, 5L, 2L, 5L, 5L, 3L, 
                                             3L, 2L, 3L, 5L, 5L, 3L, 3L, 5L, 1L, 5L, 4L, 5L, 3L, 3L, 5L, 5L, 
                                             3L, 5L, 5L, 3L, 5L, 5L, 6L, 3L, 5L, 3L, 5L, 5L, 3L, 3L, 5L, 4L, 
                                             3L, 5L, 6L, 3L, 5L, 6L, 3L, 5L, 1L, 5L, 5L, 5L, 6L, 5L, 3L, 2L, 
                                             2L, 2L, 2L, 4L, 2L, 2L, 2L, 3L, 5L, 5L, 5L, 5L, 5L, 5L, 3L, 5L, 
                                             2L, 5L, 5L, 5L, 5L, 5L, 5L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 3L, 2L, 
                                             5L, 2L, 4L, 2L, 3L, 4L, 3L, 3L, 4L, 4L, 3L, 2L, 1L, 1L, 3L, 3L, 
                                             3L, 3L, 2L, 2L, 3L, 2L, 3L, 5L, 3L, 5L, 4L, 1L, 5L, 2L, 2L, 1L, 
                                             1L, 1L, 5L, 5L, 3L, 2L, 1L, 5L, 3L, 5L, 6L, 5L, 4L, 5L, 6L, 5L, 
                                             3L, 5L, 3L, 5L, 3L, 1L, 3L, 4L, 2L, 6L, 5L, 5L, 6L, 6L, 5L, 2L, 
                                             4L, 4L, 6L, 5L, 6L, 4L, 6L, 3L, 3L, 4L, 1L, 6L, 6L, 1L, 2L, 2L, 
                                             1L, 1L, 3L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 6L, 1L, 2L, 1L, 6L, 
                                             1L, 1L, 5L, 1L, 3L, 3L, 1L, 3L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 
                                             2L, 1L, 1L, 2L, 6L, 4L, 2L, 4L, 4L, 2L, 4L, 2L, 4L, 4L, 6L, 5L, 
                                             2L, 5L, 4L, 6L, 4L, 6L, 4L, 4L, 4L, 4L, 3L, 2L, 5L, 4L, 2L, 6L, 
                                             6L, 2L, 4L, 2L, 6L, 2L, 5L, 4L, 3L, 2L, 4L, 4L, 4L, 5L, 4L, 4L, 
                                             4L, 4L, 6L, 5L, 2L, 5L, 6L, 2L, 5L, 5L, 5L, 2L, 2L, 5L, 4L, 6L, 
                                             4L, 2L, 2L, 4L, 2L, 4L, 2L, 2L, 1L, 4L, 4L, 4L, 5L, 5L, 2L, 4L, 
                                             2L, 4L, 2L, 1L, 4L, 5L, 5L, 2L, 4L, 4L, 4L, 3L, 4L, 2L, 4L, 2L, 
                                             2L, 6L, 1L, 2L, 2L, 4L, 4L, 4L, 2L, 4L, 5L, 2L, 4L, 4L, 4L, 2L, 
                                             5L, 6L, 4L, 5L, 5L, 4L, 5L, 2L, 4L, 4L, 4L, 5L, 5L, 4L, 4L, 4L, 
                                             4L, 2L, 5L, 5L, 4L, 5L, 4L, 4L, 5L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
                                             1L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 2L, 3L, 5L, 
                                             4L, 2L, 2L, 2L, 2L, 3L, 1L, 4L, 2L, 3L, 4L, 2L, 3L, 2L, 5L, 3L, 
                                             3L, 5L, 2L, 1L), .Label = c("Primaria", "Secundaria", "Bachillerato", 
                                                                         "Tecnico", "Universitario", "Otro", "No sé", "No aplica", "T?o", 
                                                                         "No se"), class = "factor"), Country = c("MX", "MX", "MX", "MX", 
                                                                                                                  "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", 
                                                                                                                  "MX", "MX", "MX", "MX", "MX", "CH", "CH", "EC", "EC", "EC", "EC", 
                                                                                                                  "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", 
                                                                                                                  "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", 
                                                                                                                  "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", 
                                                                                                                  "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", 
                                                                                                                  "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", 
                                                                                                                  "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", 
                                                                                                                  "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", 
                                                                                                                  "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", 
                                                                                                                  "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", 
                                                                                                                  "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", 
                                                                                                                  "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", 
                                                                                                                  "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", "EC", 
                                                                                                                  "EC", "EC", "EC", "EC", "EC", "EC", "EC", "GT", "GT", "GT", "GT", 
                                                                                                                  "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", 
                                                                                                                  "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", 
                                                                                                                  "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", 
                                                                                                                  "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", 
                                                                                                                  "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", 
                                                                                                                  "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", 
                                                                                                                  "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", 
                                                                                                                  "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", 
                                                                                                                  "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", 
                                                                                                                  "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", 
                                                                                                                  "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", 
                                                                                                                  "GT", "GT", "GT", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", 
                                                                                                                  "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", 
                                                                                                                  "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", 
                                                                                                                  "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", 
                                                                                                                  "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", 
                                                                                                                  "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", 
                                                                                                                  "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", 
                                                                                                                  "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", 
                                                                                                                  "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", 
                                                                                                                  "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "MX", "GT", 
                                                                                                                  "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", 
                                                                                                                  "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", 
                                                                                                                  "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", 
                                                                                                                  "GT", "GT", "GT", "GT", "GT", "GT", "GT", "GT", "CH", "CH", "CH", 
                                                                                                                  "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", 
                                                                                                                  "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", 
                                                                                                                  "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", 
                                                                                                                  "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", 
                                                                                                                  "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", 
                                                                                                                  "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", 
                                                                                                                  "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", 
                                                                                                                  "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", 
                                                                                                                  "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", 
                                                                                                                  "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", 
                                                                                                                  "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", 
                                                                                                                  "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", "CH", 
                                                                                                                  "US", "US", "US", "US", "US", "US", "US", "US", "US", "US", "US", 
                                                                                                                  "US", "US", "US", "US", "US", "US", "US", "US", "US", "US", "US", 
                                                                                                                  "US", "US", "US", "US", "US", "US", "US", "US", "US", "US", "US", 
                                                                                                                  "US", "US", "US", "US", "US", "US", "US", "US", "US")), class = c("tbl_df", 
                                                                                                                                                                                    "tbl", "data.frame"), row.names = c(NA, -618L))

1 Ответ

0 голосов
/ 29 января 2019

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

Здесь я просто выделяю первую часть того, что вы сделали, и называю это step_one.Важно отметить, что это останавливается за до преобразования столбца в символ.

step_one <-
  data %>%
  group_by(Q7_MoEd, add=TRUE) %>% 
  mutate(educ_levels_count = n()) %>% 

  #how many countries we are dealing with
  group_by(Country, add=TRUE) %>% 
  mutate(country_count = n()) %>% 

  #lets add how many education levels we have
  group_by(Q7_MoEd, Country, educ_levels_count, country_count, add=TRUE) %>% 
  summarise(
    educ_count = n(), 
    educ_percentage = round(educ_count/first(educ_levels_count),2)
    #country_percentage = educ_count/first(country_count), 
  ) %>%
  ungroup()

Затем я использую это для подсчета итогов самостоятельно:

totals <-
  step_one %>%
  mutate(Q7_MoEd = "Total") %>%
  group_by(Country, Q7_MoEd) %>%
  summarise(
    educ_count = sum(educ_count)
  ) %>%
  ungroup() %>%
  mutate(
    educ_percentage = round(educ_count/sum(educ_count),2)
    , educ_levels_count = sum(educ_count)
  )

IЯ планирую вручную установить порядок сортировки для результата (оставить «Итог» внизу и лучше отсортировать другие записи), используя переменную:

sort_order <-
  c("Primaria"
    , "Secundaria"
    , "Tecnico"
    , "Bachillerato"
    , "Universitario"
    , "Otro"
    , "Total")

Наконец, я связываю step_one и totals собирают вместе данные и модифицируют их, используя те же шаги, которые вы использовали ранее - хотя мне больше не нужно adorn_totals, потому что итоги уже рассчитаны:

bind_rows(
  step_one
  , totals
) %>% 
  mutate(
    n_percentage = paste0(educ_count," (",educ_percentage,"%)")
    , Q7_MoEd = factor(Q7_MoEd, levels = sort_order)
         ) %>%
  select(Q7_MoEd, Country, n_percentage, educ_levels_count) %>% 
  spread(Country, n_percentage, fill="0 (0.00%)")

возвращает:

# A tibble: 7 x 7
  Q7_MoEd       educ_levels_count CH          EC          GT          MX         US        
  <fct>                     <int> <chr>       <chr>       <chr>       <chr>      <chr>     
1 Primaria                     50 3 (0.06%)   2 (0.04%)   26 (0.52%)  10 (0.2%)  9 (0.18%) 
2 Secundaria                   97 36 (0.37%)  5 (0.05%)   11 (0.11%)  25 (0.26%) 20 (0.21%)
3 Tecnico                      83 56 (0.67%)  5 (0.06%)   8 (0.1%)    11 (0.13%) 3 (0.04%) 
4 Bachillerato                 79 3 (0.04%)   9 (0.11%)   35 (0.44%)  25 (0.32%) 7 (0.09%) 
5 Universitario               228 27 (0.12%)  82 (0.36%)  72 (0.32%)  44 (0.19%) 3 (0.01%) 
6 Otro                         81 12 (0.15%)  40 (0.49%)  18 (0.22%)  11 (0.14%) 0 (0.00%) 
7 Total                       618 137 (0.22%) 143 (0.23%) 170 (0.28%) 126 (0.2%) 42 (0.07%)
...