0

从下面代表用户在三个选项之间进行选择的(简化)数据中,我想根据价值因子创建一组用户选择值的百分比的箱线图。所以我想要三个箱线图,用户选择了 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
4

2 回答 2

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")
于 2010-09-08T03:23:39.627 回答
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)
于 2010-09-08T08:01:35.900 回答