2016-10-04 5 views
0

J'ai une question à choix multiples de Qualtrics que je veux utiliser pour créer des graphiques dans R. Mes données sont organisées de sorte que vous puissiez répondre à plusieurs questions pour chaque question. Par exemple, le participant 1 a sélectionné les réponses à choix multiples 1 (Q1_1) & 3 (Q1_3). Je souhaite réduire tous les choix de réponses dans un graphique à barres, une barre pour chaque option de réponse multiple (Q1_1: Q1_3) divisée par le nombre de répondants ayant répondu à cette question (dans ce cas, 3).R données du questionnaire à choix multiples à ggplot

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") 

Je veux utiliser ggplot2 et peut-être une sorte de boucle à travers Q1_1: Q1_3?

Répondre

2

Peut-être est ce que vous voulez

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") 

enter image description here

0

Voici une solution utilisant ddply du paquet 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() 

enter image description here

Note: il pourrait être plus compliqué si vous avez plusieurs colonnes relatives à d'autres questions ("Q2_1", "Q2_2" ...). Dans ce cas, la fusion des données pour chaque question pourrait être une solution.

+0

Merci , corrigée. – bVa

0

Je pense que vous voulez quelque chose comme ça (proportion avec un graphique à barres empilées):

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') 

enter image description here