Как создать сгруппированную гистограмму в R только из определенных столбцов?

#r #ggplot2

#r #ggplot2

Вопрос:

У меня есть фрейм данных, который выглядит как

 Role <- letters(1:3)
df <- data.frame(Role,
                 Female1=c(1,4,2),
                 Male1 = c(3,0,0),
                 Female2 = c(3,5,3),
                 Male2 = c(1,3,0),
                 FemaleTotal = Female1 Female2,
                 MaleTotal = Male1 Male2)
  

И хотите создать линейчатую диаграмму, сгруппированную по мужскому типу, женскому типу для каждой категории столбцов (в этом примере это было бы 1 и 2), с распределением ролей, а также другой график только с итоговыми значениями. Чтобы получить только итоговые данные, я мог бы использовать melt () и подмножество фрейма данных, чтобы в нем были только эти столбцы, но это кажется беспорядочным и не помогает с основным графиком, который я хочу создать.

Комментарии:

1. Вы пробовали запускать свой код? Работает ли это для вас? Первая строка выдает ошибку could not find function "letters" . В data.frame вызове также ошибка. Пожалуйста, убедитесь, что код, которым вы делитесь, действительно воспроизводим.

Ответ №1:

Одним из вариантов было бы изменить формат ‘long’

 library(dplyr)
library(tidyr)
library(ggplot2)
df %>% 
   pivot_longer(cols = -Role, names_to = c( "group", '.value'), 
          names_sep="(?<=[a-z])(?=(\d |Total))") %>% 
   pivot_longer(-c(Role, group)) %>%
   ggplot(aes(x = Role, y = value, fill = group))   
         geom_col()  
         facet_wrap(~ name)
  

-вывод

введите описание изображения здесь

данные

 df <- structure(list(Role = c("a", "b", "c"), Female1 = c(1, 4, 2), 
    Male1 = c(3, 0, 0), Female2 = c(3, 5, 3), Male2 = c(1, 3, 
    0), FemaleTotal = c(4, 9, 5), MaleTotal = c(4, 3, 0)), row.names = c(NA, 
-3L), class = c("tbl_df", "tbl", "data.frame"))
  

Комментарии:

1. Действительно полезно, спасибо! Быстрый вопрос, допустим, я хотел бы отобразить только столбцы с 1 и итогом, как бы я это сделал? Не знаком с pivot_longer, поэтому все это выглядит странно для меня. Не совсем уверен, что происходит с материалом names_sep

2. @Adam вы можете filter после второго «поворота», т.Е. %>% filter(name != "1") %>% ggplot(

3. Кажется, я не могу запустить код, получаю это сообщение об ошибке Ошибка: Не удается подмножество элементов, которые не существуют. x Местоположений 1, 2, 3, 4, 5, и т.д. не существует. i Есть только 0 элементов. Запустите rlang::last_error() , чтобы увидеть, где произошла ошибка. Дополнительно: Предупреждающее сообщение: Ожидается 2 штуки. Недостающие фрагменты заполнены NA в 24 строках [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, …]. Я предполагаю, что из-за части name_sep. Для получения некоторой информации о mopre имена моих столбцов на самом деле больше похожи на «Примененный женщиной X» и «Успешный мужчина Y», если это поможет.

4. @Adam Это основано на том же наборе данных в моем сообщении или на другом. Можете ли вы использовать dput , чтобы показать небольшой пример, показывающий ошибку