根据下面的(简化)数据表示用户在三个选项之间进行选择,我想根据值的因子创建一组用户选择值的百分比的箱线图。所以我想要三个箱图,百分比用户选择0,1和2。
我确定我错过了一些明显的东西,就像我经常使用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
答案 0 :(得分:1)
我会使用plyr
包创建摘要。首先,您应该将value
转换为一个因子,这样当某个用户从未选择某个值时,该值将为0%。
dat$value <- factor(dat$value)
现在,你编写了一个带有数据框的汇总函数(从技术上讲,这一步可以进入下一步,但这种方式更加清晰。)
p.by.user <- function(df){
data.frame(prop.table(table(df$value)))
}
然后,将此函数应用于dat
定义的user
的每个子集。
dat.summary <- ddply(dat, .(user), p.by.user)
此数据的基本图形框图将按此完成。
with(dat.summary, boxplot(Freq ~ Var1, ylim = c(0,1)))
如果你不介意我的两分钱,我不知道箱形图是使用这种数据的正确方法。这不是非常密集的数据(如果您的样本是真实的),并且箱图不会捕获决策之间的依赖关系。也就是说,如果某个用户经常选择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")
答案 1 :(得分: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)