R boxplot над сводкой

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

person michaeltwofish    schedule 08.09.2010    source источник


Ответы (2)


Я бы подошел к созданию сводки, используя пакет 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")
person JoFrhwld    schedule 08.09.2010
comment
Я приветствую ваши два цента! Меня интересуют выбросы, чтобы увидеть, выбрали ли какие-либо пользователи значение, существенно большее, чем другие пользователи. - person michaeltwofish; 08.09.2010

Что-то вроде этого, что вы ищете?

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)
person Joris Meys    schedule 08.09.2010