我在Ubuntu中使用R studio,标准更新为R和ggplot2
我尝试在ggplot中创建直方图,并按组分隔数据。
我需要绘图的y轴来表示由小平面网格分割的子组中每个bin的频率。
例如,如果我在数据中有两个条目
a group
1 1
2 2
我需要使用facet_grid按组拆分,然后显示a有一个1的条形图,它是组1中100%的示例,反之亦然。
我发现这样做的方法是使用(..count ..)/ sum(.. count) 但sum(.. count ..)将计算整个数据框中的频率,并会给我不想要的结果,
我无法找到深度使用..count的好文档。
question about special ggplot variables
another question about ..count..
文档中没有什么非常全面的,
这是我正在使用的示例代码
df <- data.frame(a = 1:10, b = 1:10, group = c(rep(1,5),rep(2,5)))
p<-ggplot(df) + geom_histogram(aes(x = a, y = (..count..)/sum(..count..))) +
facet_grid(group ~ .)
您可以看到y轴将包含0.1作为最高值,我希望它显示1个值的100%在例如组1中。等。
编辑:
感谢Jimbou的答案和对适合离散数据的精心构建的漫游的参考,请注意我在这里遇到的真正问题需要使用连续数据,以及分组多个值的箱子,此外,没有关于如何使用..count ..函数执行此操作的正确文档,因此我认为找到解决方案并且不使用遍历
非常重要答案 0 :(得分:2)
这是一个dplyr解决方案。
df%>% group_by(group)%>%mutate(n = n(), prop = n/sum(n))
答案 1 :(得分:2)
经过大量的游戏,你们都给出了非常好的指示, 我发现Jimbou和Shayaa的答案之间有一点点补充和融合,还有一些补充的代码可以很好地运作。
function parseArabic(str) {
return Number( str.replace(/[٠١٢٣٤٥٦٧٨٩]/g, function(d) {
return d.charCodeAt(0) - 1632;
}).replace(/[۰۱۲۳۴۵۶۷۸۹]/g, function(d) {
return d.charCodeAt(0) - 1776;
}) );
}
将获取数据并按组,成员,v_rate进行分组,并将每组的计数除以总和(组中的相对频率)
比想要用ggplot2创建直方图并使用这些值作为直方图的权重函数,否则这一切都是徒劳的,
t <- data %>% group_by(group,member,v_rate) %>% tally %>% mutate(f = n/sum(n))
效果很好。
答案 2 :(得分:1)
您可以尝试:
首先使用ave
计算每个组的长度:
df$gr_l <- ave(df$a, df$group, FUN = function(x) length(x))
使用a
获取组内每个by
的比例:
df$gr_prop <- c(by(df, df$group + df$a, FUN = function(x) length(x$a)/unique(x$gr_l) ))
绘制数据。
ggplot(df, aes(x=a, y=gr_prop)) +
geom_bar(stat="identity",position='dodge') +
facet_grid(group ~ .)
答案 3 :(得分:0)
尝试..density..
吗?这样将得出当前编写的所有总计数中的局部质量与局部计数之比