ggplot 结构化多时间段治疗效果的数据箱线图

ggplot structuring data boxplot of treatment effects in multiple time periods

我目前的数据结构如下:

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),以及 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 个级别的分数差异... 任何帮助我解决这个问题的方法都会很棒。提前谢谢你

复杂的是数据有成对的列(Treatment1、Score1 等)代表每个 treatment/score,我们需要同时跟踪给定的受试者是否接受了给定的 Treatment以及每次治疗的 Score。为此,我使用了 purrr 包(它是 tidyverse 包套件的一部分)中的一个 map 函数。

代码逐步遍历三对 treatments/scores 中的每一对,添加一个名为 Treatment 的列,指示治疗编号和 returns 堆叠(长格式)数据框。

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

现在我们使用 Treatment 在 x 轴上绘制数据,用 Treat_Flag 标记治疗编号和颜色,以根据给定受试者是否接受给定治疗提供单独的箱线图。

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

这是重塑数据的另一种方法。下面的代码使用 tidyr 中的函数而不是 reshape2 中的函数(tidyrreshape2 的继承者)。在下面的代码中,gather(d, key, value, -ID) 本质上等同于 melt(d, id.var="ID")。您可以在任何步骤停止函数链以查看中间输出。这种方法可能更符合数据重塑的 tidyverse 范例,但我发现它不如上面的 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)