2013-04-24 1 views
1

После значительного времени поиска решения и возиться, я обращаюсь за помощью в попытке отобразить взвешенные средства на коробке (я думал, что отправил этот запрос в список рассылки ggplot2 , но это было более 4 часов назад, и мой вопрос не всплыл там, поэтому, опасаясь, что я допустил ошибку в своем посте, я размещаю здесь, поскольку мой вопрос весьма срочный).Как разместить взвешенные средства на ящике

Ниже приведен пример игрушки.

#data 

value <- c(5, 7, 8, 6, 7, 9, 10, 6, 7, 10) 
category <- c("one", "one", "one", "two", "two", "two", 
       "three", "three", "three","three") 
weight <- c(1, 1.2, 2, 3, 2.2, 2.5, 1.8, 1.9, 2.2, 1.5) 
df <- data.frame(value, category, weight) 

#unweighted means by category 
ddply(df, .(category), summarize, mean=round(mean(value, na.rm=TRUE), 2)) 

    category mean 
1  one 6.67 
2 three 8.25 
3  two 7.33 

#weighted means by category 
ddply(df, .(category), summarize, 
      wmean=round(wtd.mean(value, weight, na.rm=TRUE), 2)) 

    category wmean 
1  one 7.00 
2 three 8.08 
3  two 7.26 

#unweighted means added to boxplot (which works fine) 
ggplot(df, aes(x = category, y = value, weight = weight)) + 
    geom_boxplot(width=0.6, colour = I("#3366FF")) + 
    stat_summary(fun.y ="mean", geom ="point", shape = 23, 
       size = 3, fill ="white") 

Мой вопрос в том, как я могу отображать взвешенные средства на коробке вместо невзвешенных?

ответ

4

Вы можете сохранить взвешенные средства в качестве нового кадра данных, а затем использовать его для построения geom_point(). Аргумент inherit.aes=FALSE гарантирует, что точки отображаются без наследования информации, предоставленной в вызове ggplot().

library(Hmisc) 
library(plyr) 
library(ggplot2) 
df.wm<-ddply(df, .(category), summarize, 
      wmean=round(wtd.mean(value, weight, na.rm=TRUE), 2)) 

ggplot(df, aes(x = category, y = value, weight = weight)) + 
    geom_boxplot(width=0.6, colour = I("#3366FF")) + 
    geom_point(data=df.wm,aes(x=category,y=wmean),shape = 23, 
      size = 3, fill ="white",inherit.aes=FALSE) 

enter image description here

+1

Это было как раз то, что доктор прописал. Спасибо огромное! Это было очень полезно. – user2317662

+0

По какой-то причине с этим кодом я получил ошибку, но код на [этот вопрос] (http://stackoverflow.com/questions/3277326/group-by-in-r-ddply-with-weighted-mean) работал , – Tom

+0

@Tom Для меня этот код по-прежнему работает без ошибок. –