Создание параллельной гистограммы из данных dplyr summarize () [r]

Я пытаюсь изучить R, выполнив некоторый исследовательский анализ данных по этому набору данных: https://www.cdc.gov/brfss/. Идея состоит в том, чтобы использовать как dplyr, так и ggplot2.

У меня такой код:

brfss2013 %>%
  filter(!is.na(menthlth), !is.na(veteran3)) %>%
  group_by(menthlth) %>%
  summarise(vcount = sum(veteran3 == "Yes"), nvcount = sum(veteran3 == "No"))

Я хотел бы создать параллельную гистограмму с осью x, показывающей числа от 0 до 30 (menthlth), и осью y, показывающей vcount слева и nvcount справа (для каждого значения menthlth) . Я знаю, что могу связать последнюю строку моего кода со строкой ggplot, но я не понимаю, как создать параллельную диаграмму.

Я попытался назначить вывод суммировать переменной, чтобы я мог использовать команду таять или что-то подобное, но это привело к ошибке («объект 'veteran3' не найден»). Есть ли более простой способ построить две переменные рядом напрямую?

Спасибо за вашу помощь и извините, если я упустил что-то очевидное.

Обновлено: теперь я присвоил результат переменной а, а dput(head(a, 10)) дает

structure(list(menthlth = 0:9, vcount = c(46931L, 1221L, 1861L, 1083L, 545L, 1323L, 197L, 466L, 105L, 22L), nvcount = c(287025L, 13964L, 21633L, 12505L, 6111L, 15312L, 1664L, 5882L, 1139L, 175L)), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame" ))

Привет. Было бы полезно, если бы вы могли dput(head(your data, 10)), это помогло бы в значительной степени работать с вашими данными.

tjebo 13.09.2018 18:54

так же, как вы обычно используете свою трубку. ... %>% dput(head(., 10)) или дайте ему имя. в любом случае может быть лучше

tjebo 13.09.2018 19:01

Вам необходимо melt / gather ваши данные: см. Этот возможный дубликат; или Вот этот

pogibas 13.09.2018 19:02

@Tjebo, когда я пытаюсь присвоить 'summarize' переменной (a <- summarize (...)), я получаю сообщение об ошибке, а когда я пытаюсь установить конвейер, я получаю следующее: «Ошибка в dput (., Head (., 10) ): "файл" должен быть символьной строкой или соединением "

HelloWorld4444 13.09.2018 19:09

просто используйте весь свой код, который вы показали нам выше, и поставьте перед ним a<-

tjebo 13.09.2018 19:19

вам нужна кластерная диаграмма для vcount и nvcount, например stackoverflow.com/questions/52023975/…

Jimmy 13.09.2018 19:58

Это немного сбивает с толку, но чтобы назначить результат операции конвейера, вы помещаете оператор присваивания до всей цепочке. Итак: a <- df %>% filter(...) %>% mutate(...) запустит весь канал и присвоит окончательный результат переменной a.

divibisan 13.09.2018 20:02

Спасибо @divibisan. Это хорошо знать. Я понял, что сообщение об ошибке было тем же, что и от dput, поскольку я сохранил эту строку в коде.

HelloWorld4444 13.09.2018 20:14

@SalmanLashkarara Да, это то, что я пытаюсь получить - просто не знаю, как привести мои данные в правильный формат / структуру.

HelloWorld4444 13.09.2018 20:19

@Tjebo Теперь у меня есть вывод dput. Извините, это заняло так много времени.

HelloWorld4444 13.09.2018 20:19
1
10
814
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
library(tidyverse)
# dat_ <- structure(list(menthlth = 0:9, vcount = c(46931L, 1221L, 1861L, 1083L, 545L, 1323L, 197L, 466L, 105L, 22L), nvcount = c(287025L, 13964L, 21633L, 12505L, 6111L, 15312L, 1664L, 5882L, 1139L, 175L)), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame" ))

plot_dat <- dat_ %>% gather(group,y, 2:3) # reshape your data frame for plotting - 

ggplot()+ 
  geom_col(data = plot_dat, 
           aes(as.character(menthlth), y, fill = group),
           position = position_dodge())

Вы должны сделать свой x дискретным (as.character(menthlth)). И используйте position = position_dodge(), потому что в противном случае столбцы сложены друг на друга (попробуйте его пропустить)

У меня нет доступа к вашим данным, но на основе вашего примера я сделал следующий набор данных:

dt<-data.frame(menthlth=sample( c(1:10),10),
               vcount=sample( c(1:1000),10),
               nvcount=sample( c(1:1000),10))

Вам необходимо сначала пересмотреть структуру вашего набора данных:

NewDT<- data.frame(menthlth= dt$menthlth,
                  category=c(rep("vcount",length(dt$menthlth)),rep("nvcount",length(dt$menthlth) )),
                    value=c(dt$vcount,dt$nvcount)) 

и они составляют гистограмму:

library(ggplot2)

ggplot(data=NewDT, aes(x=menthlth, y=value, fill=category)) +
  geom_bar(stat="identity", position=position_dodge())

результат:

enter image description here

Спасибо за ваш ответ. Поскольку ответ @Tjebo сработал, я не стал его использовать, но тем не менее спасибо.

HelloWorld4444 13.09.2018 20:53

Другие вопросы по теме