2010-09-08 79 views
0

从下面的(简化)数据表示用户在三个选项中进行选择,我想创建一组用户根据价值因素选择一个值的百分比的箱形图。所以我想要三个boxlot,百分比用户选择0,1和2.R boxplot over summary

我敢肯定我错过了一些明显的东西,就像我经常用R做的一样。我可以使用by(dat, dat$user, function(user) {table(user$value)/length(user$value)*100})得到百分比,但不要知道如何把它变成箱式情节。

希望是有道理的。

user|value 
1|2 
1|1 
1|0 
1|2 
1|0 
2|2 
2|2 
2|2 
2|0 
2|2 
3|2 
3|0 
3|1 
3|0 
3|1 
4|2 
4|0 
4|1 
4|0 
4|1 
5|2 
5|0 
5|1 
5|0 
5|1 
6|2 
6|0 
6|0 
6|1 
6|2 
7|0 
7|0 
7|1 
7|0 
7|1 
8|2 
8|2 
8|1 
8|1 
8|2 
9|1 
9|0 
9|0 
9|0 
9|0 
10|1 
10|2 
10|0 
10|2 
10|1 

回答

1

我会使用plyr包来创建摘要。首先,您应该将value转换为一个因子,以便当某个用户从未挑选某个值时,该值将为0%。

dat$value <- factor(dat$value) 

现在,你写你的摘要函数,它接受一个数据帧(从技术上讲这步可以smushed进入下一步,但这样一来它更清晰)。

p.by.user <- function(df){ 
    data.frame(prop.table(table(df$value))) 
} 

然后,应用此功能通过user定义的dat每一个子集。

dat.summary <- ddply(dat, .(user), p.by.user) 

这个数据的基本图形盒图将会这样完成。

with(dat.summary, boxplot(Freq ~ Var1, ylim = c(0,1))) 

如果你不介意我的两分钱,我不知道boxlot是这种数据的正确方法。这不是非常密集的数据(如果您的样本是现实的),并且箱形图不能捕获决策之间的依赖关系。也就是说,如果某个用户频繁地选择了1,那么他们一定选择了另一个频率更低。

您可以为每个用户尝试填充条形图,如果您使用ggplot2,则不需要任何预汇总。代码看起来像这样

ggplot(dat, aes(factor(user), fill = value)) + geom_bar() 
    # or, to force the range to be between 0 and 1 
    # + geom_bar(position = "fill") 
+0

我欢迎你的两分钱!我对异常值感兴趣,看看是否有用户选择的价值远远超过其他用户。 – michaeltwofish 2010-09-08 05:03:49

0

是这样的东西你在找什么?

user <- rep(1:10,each=5) 
value <- sample(0:2,50,replace=T) 
dat <- data.frame(user,value) 

percent <- unlist(
    by(dat, dat$user, 
     function(user) { 
      table(user$value)/length(user$value)*100 
     } 
    ) 
) 

# make a vector with all percentages 
percent <- unlist(percent) 
# extract the necessary info from the names 
value <- gsub("\\d+\\.(\\d)","\\1",names(percent)) 

boxplot(percent~value)