Как преобразовать данные для гистограммы на основе множественного выбора? - PullRequest
0 голосов
/ 25 марта 2019

Итак, я учусь использовать R / GGplot, было достаточно просто создать одну гистограмму, но я пытаюсь понять, как правильно манипулировать данными, чтобы получить нужный мне график.

Итак, у меня есть базовый пример файла данных, который выглядит следующим образом в RStudio:

enter image description here

enter image description here

По сути, я хотел сделать столбец для каждого параметра, который учитывает параметры «Да». В этом случае ось Y будет равна общему количеству записей с масштабом, измеренным в%.

Вот где я думаю, что я ошибся:

data_Q1 <- data.frame(Q1 = c("Red", "Blue", "Green", "Yellow", "Pink"))

Полагаю, здесь мне может понадобиться убрать уровень «Нет», а затем переименовать уровень «Да» в название цвета, прежде чем я смогу с ним работать, но мне кажется, что я очень неправильно понимаю, как я это делаю.

Я пытался использовать droplevels() и raw_data$Q1_1[grepl("Yes", raw_data$Q1, ignore.case=T)] <- "Red", но ни один из них, похоже, не достиг желаемой цели.

Вот код, который я использую для графика:

ggplot(
    data_Q1,
    aes(
        x=Q1,
        y=sum(
            complete.cases(raw_data)
        )
    )
)
+geom_bar(
    aes(
        fill=Q1
    ), 
    colour="black",
    stat="identity"
)
+labs(
    title="Colours respondents liked",
    subtitle="Q1. Select all the colours you like",
    caption="source: example data"
)
+ylab("Total completes")
+scale_y_continuous(labels = scales::percent)

structure(list(id = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 
29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 
45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 
61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 
77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 
93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 
107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 
120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 
133, 134, 135, 136, 137, 138, 139), Q1_1 = structure(c(2L, 1L, 
2L, 2L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 
2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 1L, 2L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 
2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 
1L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L), .Label = c("No", "Yes"), class = "factor"), 
    Q1_2 = structure(c(2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 
    1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 
    2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 
    2L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 1L, 1L, 1L, 
    2L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 
    2L, 1L, 2L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 1L, 
    2L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 
    2L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 
    2L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 2L), .Label = c("No", "Yes"
    ), class = "factor"), Q1_3 = structure(c(2L, 2L, 2L, 2L, 
    2L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 
    1L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 
    2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 
    1L, 1L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 
    2L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 
    2L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 
    2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 2L
    ), .Label = c("No", "Yes"), class = "factor"), Q1_4 = structure(c(1L, 
    2L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 
    2L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 1L, 1L, 1L, 
    2L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 
    1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 
    1L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 
    1L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 
    2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 
    1L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 
    1L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 
    1L, 2L, 1L), .Label = c("No", "Yes"), class = "factor"), 
    Q1_5 = structure(c(2L, 1L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 
    1L, 2L, 2L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 
    2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 
    2L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 
    1L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 
    2L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 
    1L, 1L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 
    2L, 2L, 2L, 2L, 1L, 1L, 2L, 1L, 2L), .Label = c("No", "Yes"
    ), class = "factor")), row.names = c(NA, -139L), variable.labels = c(id = "id", 
Q1_1 = "[Red] Q1. Select all the colours you like", Q1_2 = "[Blue] Q1. Select all the colours you like", 
Q1_3 = "[Green] Q1. Select all the colours you like", Q1_4 = "[Yellow] Q1. Select all the colours you like", 
Q1_5 = "[Pink] Q1. Select all the colours you like"), codepage = 65001L, class = "data.frame")

enter image description here

1 Ответ

2 голосов
/ 25 марта 2019

Хорошо, я предполагаю, что это из какого-то опроса, поэтому ваши данные (вероятно) немного запутаны. Подход с tidyverse и транспонированием (t()) будет выглядеть примерно так:

library(tidyverse)
    df <- raw_data
    df2 <- data.frame(t( df %>% summarise(Q1 = sum(Q1_1=="Yes") / length(complete.cases(df)) ,
                       Q2 = sum(Q1_2=="Yes")  / length(complete.cases(df)),
                       Q3 = sum(Q1_3=="Yes")  / length(complete.cases(df)),
                       Q4 = sum(Q1_4=="Yes")  / length(complete.cases(df)),
                       Q5 = sum(Q1_5=="Yes")  / length(complete.cases(df)),) ))

names(df2) <- ("sum_yes")
df2$q <- rownames(df2)

Вывод df2:

> df2
     sum_yes  q
Q1 0.8417266 Q1
Q2 0.7338129 Q2
Q3 0.7122302 Q3
Q4 0.4820144 Q4
Q5 0.7122302 Q5
> 

Затем мы строим результаты:

library(ggplot2)

   ggplot(
  df2,
  aes(
    x=q,
    y = sum_yes,
    fill = q
  )
) + 
  geom_bar( 
  colour="black",
  stat="identity"
) + labs(
  title="Colours respondents liked",
  subtitle="Q1. Select all the colours you like",
  caption="source: example data"
) +  ylab("Total completes")+scale_y_continuous(labels = scales::percent) + 
  scale_fill_manual(values= c("Red", "Blue", "Green", "Yellow", "Pink") )

enter image description here

с помощью scale_fill_manual вы можете просто указать, какими должны быть цвета ваших результатов. Если я правильно понял данные, вам придется заменить имена (Q1 до Q5) соответствующими цветами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...