R данные анкеты с множественным выбором для ggplot

У меня есть вопрос Qualtrics с несколькими вариантами ответов, который я хочу использовать для создания графиков в R. Мои данные организованы таким образом, чтобы вы могли ответить на несколько ответов на каждый вопрос. Например, участник 1 выбрал ответы с несколькими вариантами ответов 1 (Q1_1) и 3 (Q1_3). Я хочу свести все варианты ответов в одну гистограмму, по одной гистограмме для каждого варианта множественного ответа (Q1_1:Q1_3), разделенную на количество респондентов, ответивших на этот вопрос (в данном случае, 3).

df <- structure(list(Participant = 1:3, A = c("a", "a", ""), B = c("", "b", "b"), C = c("c", "c", "c")), .Names = c("Participant", "Q1_1", "Q1_2", "Q1_3"), row.names = c(NA, -3L), class = "data.frame")

Я хочу использовать ggplot2 и, возможно, какой-то цикл через Q1_1: Q1_3?


person lmcshane    schedule 04.10.2016    source источник


Ответы (3)


Возможно, это то, что вы хотите

f <- 
  structure(
    list(
      Participant = 1:3,
      A = c("a", "a", ""),
      B = c("", "b", "b"),
      C = c("c", "c", "c")),
    .Names = c("Participant", "Q1_1", "Q1_2", "Q1_3"),
    row.names = c(NA, -3L),
    class = "data.frame"
  )


library(tidyr)
library(dplyr)
library(ggplot2)

nparticipant <- nrow(f)
f %>% 
  ## Reformat the data
  gather(question, response, starts_with("Q")) %>%
  filter(response != "") %>%

  ## calculate the height of the bars
  group_by(question) %>%
  summarise(score = length(response)/nparticipant) %>%

  ## Plot
  ggplot(aes(x=question, y=score)) +
  geom_bar(stat = "identity")

введите здесь описание изображения

person csiu    schedule 04.10.2016

Вот решение, использующее ddply из пакета dplyr.

# I needed to increase number of participants to ensure it works in every case
df = data.frame(Participant = seq(1:100), 
Q1_1 = sample(c("a", ""), 100, replace = T, prob = c(1/2, 1/2)), 
Q1_2 = sample(c("b", ""), 100, replace = T, prob = c(2/3, 1/3)), 
Q1_3 = sample(c("c", ""), 100, replace = T, prob = c(1/3, 2/3)))
df$answer = paste0(df$Q1_1, df$Q1_2, df$Q1_3)

summ = ddply(df, c("answer"), summarize, freq = length(answer)/nrow(df))

## Re-ordeing of factor levels summ$answer
summ$answer <- factor(summ$answer, levels=c("", "a", "b", "c", "ab", "ac", "bc", "abc"))

# Plot 
ggplot(summ, aes(answer, freq, fill = answer)) + geom_bar(stat = "identity") + theme_bw() 

введите здесь описание изображения

Примечание. Это может быть сложнее, если у вас есть несколько столбцов, относящихся к другим вопросам ("Q2_1", "Q2_2"...). В этом случае данные о плавке для каждого вопроса могут быть решением.

person bVa    schedule 04.10.2016

Я думаю, вы хотите что-то вроде этого (пропорция с гистограммой с накоплением):

  Participant Q1_1 Q1_2 Q1_3
1           1    a         c
2           2    a    a    c
3           3    c    b    c
4           4         b    d

# ensure that all question columns have the same factor levels, ignore blanks
for (i in 2:4) {
   df[,i] <- factor(df[,i], levels = c(letters[1:4]))
}

tdf <- as.data.frame(sapply(df[2:4], function(x)table(x)/sum(table(x))))
tdf$choice <- rownames(tdf)
tdf <- melt(tdf, id='choice')

ggplot(tdf, aes(variable, value, fill=choice)) + 
       geom_bar(stat='identity') + 
       xlab('Questions') + 
       ylab('Proportion of Choice')

введите здесь описание изображения

person Sandipan Dey    schedule 04.10.2016