2017-07-03 5 views
1

Ich habe Daten, die derzeit wie so strukturiert:ggplot Strukturierung von Daten boxplot von Behandlungseffekten in mehreren Zeitperioden

set.seed(100) 
require(ggplot2) 
require(reshape2) 


d<-data.frame("ID" = 1:30, 
      "Treatment1" = sample(0:1,30,replace = T, prob = c(0.5,0.5)), 
      "Score1" = rnorm(30)^2, 
      "Treatment2" = sample(0:1,30,replace = T,prob = c(0.3,0.7)), 
      "Score2" = rnorm(30)^2, 
      "Treatment3" = sample(0:1,30,replace = T,prob = c(0.2,0.8)), 
      "Score3" = rnorm(30)^2) 

Wo gibt es eindeutige IDs, 3 verschiedene Behandlungen (codiert 1, wenn sie die gegebene Behandlung und 0 empfangen, wenn nicht) und die verschiedenen Scores, die die Ids nach jeder Behandlungsperiode haben. Ich versuche, einen Boxplot zu erstellen, der die Punktzahlverteilung für jede Behandlungsperiode für jede der eindeutigen IDs im Datensatz darstellt, aber ich schmelze die Daten entweder nicht richtig oder sie codieren die Grafik nicht richtig oder beides.

d.melt<-melt(d,id.vars = c("ID","Treatment1","Treatment2","Treatment3"),measure.vars = c("Score1","Score2","Score3")) 

ich die boxplot produzieren kann, die die Noten von getrennt zeigt an, ob sie mit diesem Code eine der drei Behandlungen erhielt:

ggplot(d.melt)+ 
    geom_boxplot(aes(x = variable,y = value,fill = factor(Treatment1))) 

Aber das wird den Unterschied in allen Noten für die einzige plotten IDs, die Behandlung 1 bekommen haben und nicht den Unterschied in den Bewertungen für alle 3 Ebenen ... Irgendwelche Hilfe, meinen Kopf um dieses Problem zu bekommen, wäre großartig. Vielen Dank im Voraus

+0

Vielleicht kombinieren was Sie bereits tun mit 'facet_grid'. – ulfelder

+0

Ich bin mir nicht sicher, ob das was du willst: https://stackoverflow.com/questions/14604439/plot-multiple-boxplot-in-oneegraph –

Antwort

1

Die Komplikation ist, dass die Daten Paare von Spalten (Treatment1, Score1, etc.) für jede Behandlung/Ergebnis und wir müssen verfolgen, ob ein gegebenes Thema erhalten Treatment und ihre Score für jede Behandlung. Ich habe dafür eine der map-Funktionen aus dem purrr-Paket (die Teil der tidyverse Paket-Suite ist) verwendet.

Der Code durchläuft jedes der drei Behandlungspaare/Scores, fügt eine Spalte mit der Bezeichnung Treatment hinzu, die die Behandlungsnummer angibt und gibt den gestapelten (langen Format) Datenrahmen zurück.

library(tidyverse) 

dr = map2_df(seq(2,ncol(d),2), seq(3,ncol(d),2), 
      function(t,s) { 
       data.frame(ID = d[,"ID"], 
          Treatment = gsub(".*([0-9]$)", "\\1", names(d)[t]), 
          Treat_Flag = d[,t], 
          Score = d[,s]) 
      }) 

Nun zeichnen wir die Daten Treatment auf der x-Achse mit der Behandlung Anzahl und Farbe zu markieren, indem Treat_Flag Plots separater Box basierend auf zur Verfügung zu stellen, ob eine bestimmte Person eine bestimmte Behandlung erhalten.

ggplot(dr, aes(Treatment, Score, colour=factor(Treat_Flag))) + 
    geom_boxplot() + 
    theme_classic() + 
    labs(colour="Treatment Indicator") 

enter image description here

Hier ist eine andere Möglichkeit, die Daten neu zu gestalten. Der folgende Code verwendet Funktionen von tidyr anstelle von reshape2 (tidyr ist der Nachfolger von reshape2). In dem folgenden Code entspricht gather(d, key, value, -ID) im Wesentlichen melt(d, id.var="ID"). Sie können die Funktionskette bei jedem Schritt anhalten, um die Zwischenausgänge zu betrachten. Dieser Ansatz entspricht wahrscheinlich eher dem Paradigma der Datenumformung, aber ich finde es ein bisschen weniger intuitiv als der oben beschriebene Lösungsansatz().

dr = gather(d, key, value, -ID) %>% 
    separate(key, into=c("key", "value2"), sep="(?=[0-9])") %>% 
    spread(key, value) %>% 
    rename(Treatment=value2, Treat_Flag=Treatment) 
+0

Vielen Dank –

Verwandte Themen