Ответ 1
Сначала вам нужно получить подсчеты для каждой категории, т.е. сколько Плохих и Товаров и так далее для каждой группы (Еда, Музыка, Люди). Это будет сделано следующим образом:
raw <- read.csv("http://pastebin.com/raw.php?i=L8cEKcxS",sep=",")
raw[,2]<-factor(raw[,2],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)
raw[,3]<-factor(raw[,3],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)
raw[,4]<-factor(raw[,4],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)
raw=raw[,c(2,3,4)] # getting rid of the "people" variable as I see no use for it
freq=table(col(raw), as.matrix(raw)) # get the counts of each factor level
Затем вам нужно создать из него кадр данных, расплавить его и занести в него:
Names=c("Food","Music","People") # create list of names
data=data.frame(cbind(freq),Names) # combine them into a data frame
data=data[,c(5,3,1,2,4)] # sort columns
# melt the data frame for plotting
data.m <- melt(data, id.vars='Names')
# plot everything
ggplot(data.m, aes(Names, value)) +
geom_bar(aes(fill = variable), position = "dodge", stat="identity")
Это то, что вам нужно?
Чтобы немного разъяснить, в ggplot несколько панелях группировки, у вас был фрейм данных, который выглядел следующим образом:
> head(df)
ID Type Annee X1PCE X2PCE X3PCE X4PCE X5PCE X6PCE
1 1 A 1980 450 338 154 36 13 9
2 2 A 2000 288 407 212 54 16 23
3 3 A 2020 196 434 246 68 19 36
4 4 B 1980 111 326 441 90 21 11
5 5 B 2000 63 298 443 133 42 21
6 6 B 2020 36 257 462 162 55 30
Так как у вас есть числовые значения в столбцах 4-9, которые позже будут построены на оси y, это можно легко преобразовать с помощью reshape
и нанести на график.
Для нашего текущего набора данных нам понадобилось нечто похожее, поэтому мы использовали freq=table(col(raw), as.matrix(raw))
для получения этого:
> data
Names Very.Bad Bad Good Very.Good
1 Food 7 6 5 2
2 Music 5 5 7 3
3 People 6 3 7 4
Представьте, что у вас есть Very.Bad
, Bad
, Good
и т.д. вместо X1PCE
, X2PCE
, X3PCE
. См. Сходство? Но сначала нам нужно создать такую структуру. Следовательно, freq=table(col(raw), as.matrix(raw))
.