2017-07-03 94 views
1

我已數據目前的結構,如下所示:ggplot結構化數據箱線圖

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) 

哪裏有唯一的ID,3個不同的處理(編碼1,如果它們接收到的給定的治療和0,如果沒有),以及在每個治療期後的不同分數。我正在嘗試創建一個boxplot,用於說明數據集中每個獨特ID的每個治療期相關的分數分佈,但是我要麼沒有正確融化數據,要麼沒有正確編碼,或者兩者都沒有。

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

我可以產生表示由他們是否收到的三種治療方法與此代碼一個分離的得分箱線圖:

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

但這隻會繪製中的所有得分的差別得到治療1的ID,而不是所有3個水平的得分差異... 任何幫助我解決這個問題的方法都會很棒。預先感謝您

+0

也許結合你已經在用'facet_grid'做的事情。 – ulfelder

+0

我不確定這是你想要的:https://stackoverflow.com/questions/14604439/plot-multiple-boxplot-in-one-graph –

回答

1

併發症是數據有成對的列(Treatment1,Score1等)代表每個治療/分數,我們需要跟蹤給定的受試者是否收到給定的Treatment及其Score爲每個治療。我已經使用purrr包中的map函數之一(它是tidyverse套件包的一部分)。

代碼逐步通過三對治療/評分中的每一個,添加一個名爲Treatment的列,指示治療號碼並返回堆疊(長格式)數據幀。

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]) 
      }) 

現在我們通過Treat_Flag繪製在x軸上使用Treatment來標記治療數量和顏色的數據,以提供基於給定的受試者是否接收到一個給定的治療單獨的箱線圖。

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

enter image description here

這裏是另一種方式來重塑數據。以下代碼使用的函數來自tidyr而不是來自reshape2tidyrreshape2的後繼)。在下面的代碼中,gather(d, key, value, -ID)基本上相當於melt(d, id.var="ID")。您可以在任何步驟停止功能鏈查看中間輸出。這種方法可能更符合數據整形的範式,但我覺得它比上面的map方法有點不直觀。

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

非常感謝你 –