R: гистограмма и плотность на фрейме данных ответа нескольких пользователей - PullRequest
0 голосов
/ 03 июля 2018

Описание данных

Данные отражают то, как пользователи оценивали книгу на сайте с рекомендациями по книгам в Интернете, отвечая на вопрос, на который есть четыре ответа. Пользователям было разрешено выбрать более одного ответа.

Цель состоит в том, чтобы получить графики распределения по полу, где X ось как ответ (X1,X2..) и Y ось как количество книг вместе с наложением плотности. Было бы здорово, чтобы и мужчина, и женщина накладывали друг на друга.

book_id  user_id  rate  X1   X2   X3    X4  Gender  genre
40         001     4.5    0    1    0    0  male    fiction
48         001     3.5    1    0    0    1  male    fiction
54         001     4.0    1    0    0    0  male    fiction
79         001     2.5    1    0    1    0  male    non-fiction
80         001     4.5    0    0    1    0  male    non-fiction
95         001     5.0    1    0    1    0  male    non-fiction
95         002     3.0    0    0    0    1  Female  non-fiction
99         002     4.5    0    0    1    0  Female  non-fiction
02         002     0.5    0    0    0    0  Female  non-fiction
05         002     4.5    1    0    1    0  Female  non-fiction
54         002     4.0    0    1    0    0  Female  fiction
79         002     2.5    1    0    1    0  Female  non-fiction
80         002     4.5    0    0    1    0  Female  non-fiction
07         002     4.5    1    0    1    0  Female  fiction
07         003     5.0    1    0    1    0  Female  fiction
09         003     4.0    0    0    1    0  Female  auto-bio
54         003     4.0    1    0    0    0  Female  fiction
79         003     2.5    1    0    1    0  Female  non-fiction
80         003     4.5    0    0    1    0  Female  non-fction
17         004     3.5    1    0    0    0  male    auto-bio
21         004     5.0    1    0    1    0  male    auto-bio
21         005     5.0    0    1    1    0  male    auto-bio
17         005     0.5    0    0    0    1  male    auto-bio
20         005     5.0    0    0    1    0  male    fiction
20         006     1.5    0    0    0    1  male    fiction
21         006     5.0    0    0    1    0  male    auto-bio
21         007     2.0    1    0    0    0  male    auto-bio
21         008     4.5    1    0    1    0  Female  auto-bio
20         008     4.5    1    0    1    0  Female  fiction
07         008     4.5    1    0    1    0  Female  fiction
22         009     5.0    0    0    1    0  male    fiction
54         009     4.0    1    0    0    0  male    fiction
79         009     2.5    1    0    1    0  male    non-fiction
80         010     4.5    1    0    1    0  male    non-fiction
22         010     4.5    0    1    1    0  male    fiction
22         011     0.5    0    0    1    0  Female  fiction
28         011     3.5    1    0    0    0  Female  auto-bio

Два пользователя могут оценивать одну и ту же книгу и отвечать на вопрос одинаково или по-разному. Это создает две записи для каждой книги. Имея это в виду, если сгруппировать по Gender и суммировать каждый столбец, получим распределение по полу.

df %>% group_by(Gender) %>% summarize(x1 = sum(X1), x2 = sum(X2), x3=sum(X3),x4 =sum(X4))

  Gender    x1    x2    x3    x4
  <fct>  <int> <int> <int> <int>
1 Female    10     1    13     1
2 male      10     3    11     3

В дополнение к получению сюжета: У меня также есть следующий вопрос: Кроме того, просто чтобы подтвердить, что это не уникальное число женских ответов x1, так как несколько пользователей могут ответить на одну и ту же книгу. Вместо этого, будет ли число женщин выбрать конкретный ответ?

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Аналогичный, но другой подход

library(data.table)
library(ggplot2)
dt <- setDT(dt)

plottest <- melt(dt,measure.vars = patterns("^X"),variable.name = "question", value.name = "answer")

ggplot(data = plottest,aes(factor(book_id),answer))+
  geom_col(aes(fill = as.factor(question), color = as.factor(question) ))+
  facet_wrap(~Gender)+
  labs(title =  "",
       y = "N",
       x = "books",
       color = "Question",
       fill = "Question")

enter image description here

0 голосов
/ 03 июля 2018

Я не уверен, что правильно понимаю, но вам нужен следующий код?

library(dplyr)
library(ggplot2)

df2 <- df %>% 
  group_by(Gender) %>% 
  summarize(x1 = sum(X1), x2 = sum(X2), x3=sum(X3),x4 =sum(X4)) %>%
  melt(id.vars = "Gender")


ggplot(df2, aes(variable, value, color = Gender, fill = Gender)) +
  geom_bar(stat = "identity", position = "dodge")

enter image description here

Увидев ответ @denis, я адаптировал его код, чтобы сделать более или менее то же самое, но с position = "dodge".

df3 <- df %>% 
  group_by(Gender, book_id) %>% 
  summarize(x1 = sum(X1), x2 = sum(X2), x3=sum(X3),x4 =sum(X4)) %>%
  melt(id.vars = c("Gender", "book_id"))

ggplot(df3, aes(as.factor(book_id), value, color = variable, fill = variable)) +
  geom_bar(stat = "identity", position = "dodge") +
  facet_wrap(~ Gender)

enter image description here

Что касается второго вопроса, вы можете использовать aggregate, чтобы получить ответы на каждый вопрос по Gender.

aggregate(. ~ Gender, df[4:8], sum)
#  Gender X1 X2 X3 X4
#1 Female 10  1 13  1
#2   male 10  3 11  3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...