Загружая пакет tidyr, можно изменить данные для поддержки ожидаемого вывода.
library(ggplot2)
library(tidyr)
После чтения данных с правильными классами для столбцов (факторы для канала и региона, а остальныешесть полей являются числовыми), проверьте правильность данных.
df <- read.csv(file = url('https://archive.ics.uci.edu/ml/machine-learning-databases/00292/Wholesale%20customers%20data.csv'), colClasses = c('factor','factor','numeric','numeric','numeric','numeric','numeric','numeric'))
str(df)
'data.frame': 440 obs. of 8 variables:
$ Channel : Factor w/ 2 levels "1","2": 2 2 2 1 2 2 2 2 1 2 ...
$ Region : Factor w/ 3 levels "1","2","3": 3 3 3 3 3 3 3 3 3 3 ...
$ Fresh : num 12669 7057 6353 13265 22615 ...
$ Milk : num 9656 9810 8808 1196 5410 ...
$ Grocery : num 7561 9568 7684 4221 7198 ...
$ Frozen : num 214 1762 2405 6404 3915 ...
$ Detergents_Paper: num 2674 3293 3516 507 1777 ...
$ Delicassen : num 1338 1776 7844 1788 5185 ...
head(df)
Channel Region Fresh Milk Grocery Frozen Detergents_Paper Delicassen
1 2 3 12669 9656 7561 214 2674 1338
2 2 3 7057 9810 9568 1762 3293 1776
3 2 3 6353 8808 7684 2405 3516 7844
4 1 3 13265 1196 4221 6404 507 1788
5 2 3 22615 5410 7198 3915 1777 5185
6 2 3 9413 8259 5126 666 1795 1451
Похоже, что данные импортированы правильно.
Далее мы используемкомбинация tidyr :: collect и ggplot2 :: ggplot для создания желаемого гистограммы (не гистограммы).
df %>%
tidyr::gather(Type, Amount, -c(Channel, Region)) %>%
ggplot(aes(x=Type, y=Amount, fill=Channel, group=Channel)) +
geom_col(position = position_dodge())
tidyr::gather(Type, Amount, -c(Channel, Region))
изменит набор данных из этого:
Channel Region Fresh Milk Grocery Frozen Detergents_Paper Delicassen
1 2 3 12669 9656 7561 214 2674 1338
2 2 3 7057 9810 9568 1762 3293 1776
3 2 3 6353 8808 7684 2405 3516 7844
4 1 3 13265 1196 4221 6404 507 1788
5 2 3 22615 5410 7198 3915 1777 5185
6 2 3 9413 8259 5126 666 1795 1451
В «более длинный» набор данных, который теперь имеет тип продукта в виде строк:
Channel Region Type Amount
1 2 3 Fresh 12669
2 2 3 Fresh 7057
3 2 3 Fresh 6353
4 1 3 Fresh 13265
5 2 3 Fresh 22615
6 2 3 Fresh 9413
Это подготовит данные для построения с использованиемggplot2 :: ggplot, где ввод x может быть сопоставлен с новой переменной Type, а переменная y с Amount.Обязательно используйте Group=Channel
и position=position_dodge()
, чтобы ggplot знал, что вы хотите столбцы рядом.