Выбор лучших n групп с помощью dplyr, а затем построение других переменных - PullRequest
0 голосов
/ 18 января 2019

У меня есть набор данных, в котором я пытаюсь выбрать только верхний n путем подсчета одной категории, а затем нанести график с использованием других переменных в наборе данных - в основном один уровень агрегации для верхнего n, но мне нужно вернуться к полные данные для построения в ggplot.

Итак, в приведенной ниже задаче я хочу получить два наиболее распространенных examName с, а затем построить и facetwrap их путем подсчета year.

ap <- 
      tribble(
        ~year, ~examName,
        2014, "Statistics",
        2015, "Statistics",
        2016, "Statistics",
        2016, "Statistics",
        2016, "Statistics",
        2016, "Statistics",
        2017, "Statistics",
        2017, "Statistics",
        2017, "Statistics",
        2017, "Statistics",
        2017, "Statistics",
        2013, "Macroeconomics",
        2013, "Macroeconomics",
        2014, "Macroeconomics",
        2015, "Macroeconomics",
        2016, "Macroeconomics",
        2016, "Macroeconomics",
        2016, "Macroeconomics",
        2016, "Macroeconomics",
        2016, "Macroeconomics",
        2017, "Macroeconomics",
        2017, "Macroeconomics",
        2017, "Macroeconomics",
        2017, "Macroeconomics",
        2017, "Macroeconomics",
        2017, "Macroeconomics",
        2013, "Calculus",
        2014, "Calculus",
        2015, "Calculus",
        2016, "Calculus",
        2017, "Calculus",
        2017, "Psychology",
        2017, "Psychology",
        2017, "Psychology",
        2017, "Psychology",
        2017, "Psychology",
        2018, "Psychology",
        2018, "Psychology")


ap_top <- ap %>% 
    count(examName, sort = TRUE) %>% 
    head(2) %>% 
    inner_join(ap, by = "examName") %>% 
    select(-n)

ap_top %>% 
    count(examName, year) %>% 
    ggplot(aes(x = year, y = n, group = examName)) +
    geom_line() +
    facet_wrap(~ examName)

Я думал, что верну мои лучшие n, а затем inner_join верну исходный набор данных. Затем составьте график, используя это; по существу, используя внутреннее соединение в качестве фильтра.

Я знаю, что есть лучший способ сделать это, и я бы хотел более элегантное решение! Я весь во внимании! Пример набора данных дан (извините, это так долго).

Ответы [ 2 ]

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

Другая возможность:

ap %>% 
 group_by(examName) %>%
 mutate(temp = n()) %>%
 ungroup() %>%
 mutate(temp = dense_rank(desc(temp))) %>%
 filter(temp %in% c(1,2)) %>%
 select(-temp) %>%
 count(year, examName) %>% 
 ggplot(aes(x = year, y = n, group = examName)) +
 geom_line() +
 facet_wrap(~ examName)

Подсчитывает количество случаев по «examName» и оценивает количество. Затем он фильтрует случаи с наибольшим и вторым наибольшим числом.

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

Вам не нужно inner_join() Я бы просто определил два верхних экзамена в отдельном утверждении, а затем отфильтровал их.

top_exams <- count(ap, examName) %>% 
  top_n(2, n) %>% pull(examName)

ap %>% 
  filter(examName %in% top_exams) %>% 
  count(year, examName) %>% 
  ggplot(aes(x = year, y = n, group = examName)) +
  geom_line() +
  facet_wrap(~ examName)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...