【发布时间】:2017-03-24 05:13:37
【问题描述】:
df = data.frame(week = as.factor(rep(c(1, 2), times = 5)),
name = as.factor(rep(LETTERS[1:5], times = 2)),
count = rpois(n = 10, lambda = 20))
> df
week name count
1 1 A 16
2 2 B 14
3 1 C 23
4 2 D 15
5 1 E 12
6 2 A 15
7 1 B 23
8 2 C 22
9 1 D 22
10 2 E 26
我想计算每个名字每周的计数份额。 起初我打算使用以下方法:
transform(df, week1_share = ifelse(week == "1", round((df$count / sum(df$count) * 100),2), NA))
transform(df, week2_share = ifelse(week == "2", round((df$count / sum(df$count) * 100),2), NA))
但是随后将每一列合并,最终将其作为条形图上的标签,似乎效率太低了。必须有某种我还不知道的快速解决方案。
基本上我想做的事情如下,但添加上面可能计算的份额百分比以匹配每个框。
ggplot(df, aes(reorder(week, -count),count, color = "white", group = name, fill = name))+
geom_bar(position = "stack", stat = "identity") +
scale_y_continuous(labels=comma)+
ggthemes::scale_color_tableau()
我不知道为什么重新排序功能经常在我身上失败。如果您有任何以 desc 排序顺序的提示,请分享。
【问题讨论】:
-
你的意思是
aggregate(count ~ name, df, function(i)round(i*100/sum(i), 2))?或df$new <- with(df, ave(count, name, FUN = function(i)(round(i*100/sum(i), 2)))) -
对于每周的计数份额,您可以使用 dplyr 按周分组并变异以添加列。
library(dplyr)和df<- mutate(group_by(df,week), round(count/sum(count) * 100, 2)) -
嗨,好问题,你能改正你的错字吗:
data_frame而不是data.frame,供人们复制粘贴数据。
标签: r ggplot2 bar-chart geom-bar