我有一个Excel文件,我正在尝试创建一个条形图,该类别对类别进行分组并显示该类别的平均评级。因为有很多类别,我还想在结果水平条形图中只显示前10或后10。
category rating
A 10
A 8
A 9
B 1
B 4
B 9
C 6
C 7
D 9
像这样的东西(代表条而不是数字):
A 9
D 9
...
C 6.5
B 4.66
我知道这看起来非常简单,但在这里尝试各种答案之后我似乎无法获得任何工作。到目前为止,使用ggplot2似乎是最有希望的。我得到的最接近的是显示每个类别的评分数量......
编辑:没有保存我之前做的工作,因为它不是我想要的结果,但它是这样的(没有使用ggplot)
dat[,c(1,12)]
category = dat[,1] //selecting column from sheet
rating = dat[,12] //selecting column from sheet
rating<-as.numeric(unlist(dat[,12]))
dat<-table(dat$rating,dat$category)
barplot(dat, main="Overall Ratings",
xlab="Ratings", col=c("skyblue","red"), horiz=TRUE,
legend = rownames(dat))
答案 0 :(得分:2)
这是使用dplyr
和tidyr
的链式解决方案。首先,我们需要加载数据。
library(dplyr)
library(tidyr)
library(ggplot2)
df <- read.table(text="category,rating
A,10
A,8
A,9
B,1
B,4
B,9
C,6
C,7
D,9
", sep=",", header=TRUE)
现在解决方案。在按category
对数据进行分组后,我们会计算每个类别的平均评分。
means.df <-
df %>%
group_by(category) %>%
summarise(mean = mean(rating))
top_n
从数据集中选择n行的顶部(正数)或底部(负数)。我们使用平均值将其应用于数据集。在您的实际数据中,将顶部调整为2到10,将底部10个类别调整为-10。
means.df %>%
top_n(2, mean) %>%
ggplot(aes(x = category, y = mean)) +
geom_bar(stat = 'identity')
以下代码将顶部/底部cutoff_number
类别绘制成一个图表。根据需要调整变量cutoff_number
。
cutoff_number <- 2
means.df %>%
arrange(-mean) %>%
mutate(
topbottom = ifelse(row_number() <= cutoff_number, "top", NA),
topbottom = ifelse(row_number() > nrow(.) - cutoff_number, "bottom", topbottom)
) %>%
ggplot(aes(x = category, y = mean)) +
geom_bar(stat = 'identity') +
facet_wrap(~topbottom, scales = 'free_x')
答案 1 :(得分:0)
此解决方案使用data.table汇总数据,然后将结果传递给ggplot:
library(data.table);library(ggplot2)
category=c("A","A","A","B","B","B","C","C","D")
rating=c(10,9,8,1,4,9,6,7,9)
dt=as.data.table(cbind(category,rating))
ggplot(dt[,mean(as.numeric(rating)),by=category],aes(category,V1))+geom_col()+ylab("Mean")