ggplot构建多个时间段内治疗效果的数据框图

时间:2017-07-03 18:35:47

标签: r ggplot2 boxplot melt

我目前的数据结构如下:

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),以及每个治疗期后Ids的不同分数。我试图创建一个箱线图来说明与数据集中每个唯一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个等级的得分差异...... 任何有助于解决这个问题的帮助都会很棒。提前谢谢

1 个答案:

答案 0 :(得分:1)

复杂的是,数据具有代表每个治疗/分数的成对列(治疗1,分数1等),我们需要跟踪给定受试者是否接受给定Treatment及其{{{ 1}}每次治疗。为此,我使用了Score包中的map函数之一(它是purrr包的一部分)。

代码逐步完成三对治疗/分数中的每一对,添加一个名为tidyverse的列,指示治疗编号并返回堆叠(长格式)数据框。

Treatment

现在我们在x轴上使用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标记治疗编号和颜色,以根据给定受试者是否接受给定治疗提供单独的箱形图。

Treat_Flag

enter image description here

这是重塑数据的另一种方法。以下代码使用的是ggplot(dr, aes(Treatment, Score, colour=factor(Treat_Flag))) + geom_boxplot() + theme_classic() + labs(colour="Treatment Indicator") 而不是tidyr的函数(reshape2tidyr的后续函数)。在下面的代码中,reshape2基本上等同于gather(d, key, value, -ID)。您可以在任何步骤停止功能链以查看中间输出。这种方法可能更符合数据重塑的melt(d, id.var="ID")范例,但我发现它比上面的tidyverse方法更不直观。

map