2017-07-03 92 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

非常感谢你 –