Такая задача часто возникает в анализе данных. Давайте посмотрим ее решение на примере Toy example
Создаем данные
df = data.frame(a = sample(c('a', 'b', 'c', 'd'), 1000, replace = TRUE), b = sample(c('x', 'y', 'zizuzi'), 1000, replace = TRUE), c = rnorm(1000))Загружаем необходимые библиотеки
library(dplyr) # преобразование данных library(ggplot2) # визуализация library(scales) # на диаграмме значения преобразовывает в %Далее собственно преобразование
df1 = df %>% select(a, b) %>% # выбирает только нужные нам переменные filter(a != 'd')%>% # при необходимости удаяем ненужные уровни mutate(b = case_when( # можем поменять уровни переменной b == 'x' ~ 'x', b == 'y' ~ 'y', b == 'zizuzi' ~ "z" ) ) %>% group_by(a,b) %>% # оставшаяся чсть пайплайна нужна для меток на диаграмме summarise(count=n()) %>% mutate(perc=count/sum(count))В этом пайплайне команды filter и mutate только на тот случай, если вам нужно что-то почистить и подготовить. Фишка в основном - расчет % Визуализация
ggplot(df1, aes( a,y = perc, fill = b)) + geom_bar(stat="identity") + geom_text(aes(label=scales::percent(perc, accuracy = .1)) , position = position_stack(vjust = 0.5), color="white" ,size=5) + theme(text = element_text(size=15), axis.text.x = element_text(size=15, angle = 80, hjust = 1, colour = 'black'), legend.title = element_blank(), axis.title = element_blank())Ну и получается что-то типа
Цвета, размеры шрифтов - дело вкуса
Комментариев нет:
Отправить комментарий