2010-09-08 3 views
0

Из (упрощенных) данных, приведенных ниже, которые представляют пользователя, выбирающего между тремя параметрами, я хочу создать набор ящиков в процентах от того, сколько раз пользователь выбрал значение, основанное на коэффициенте стоимости. Итак, я хочу три ящика, процент пользователей выбрал 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))) 
} 

Затем применить эту функцию к каждому подмножеству 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") 
+0

Я приветствую ваши два цента! Я заинтересован в выбросах, чтобы узнать, выбрали ли пользователи значение, значительно большее, чем другие пользователи. – michaeltwofish

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)