R boxplot на резюме - PullRequest
       3

R boxplot на резюме

0 голосов
/ 08 сентября 2010

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

Ответы [ 2 ]

1 голос
/ 08 сентября 2010

Я бы подошел к созданию резюме, используя пакет 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")
0 голосов
/ 08 сентября 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)
...