我目前的数据结构如下:
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个等级的得分差异...... 任何有助于解决这个问题的帮助都会很棒。提前谢谢
答案 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
这是重塑数据的另一种方法。以下代码使用的是ggplot(dr, aes(Treatment, Score, colour=factor(Treat_Flag))) +
geom_boxplot() +
theme_classic() +
labs(colour="Treatment Indicator")
而不是tidyr
的函数(reshape2
是tidyr
的后续函数)。在下面的代码中,reshape2
基本上等同于gather(d, key, value, -ID)
。您可以在任何步骤停止功能链以查看中间输出。这种方法可能更符合数据重塑的melt(d, id.var="ID")
范例,但我发现它比上面的tidyverse
方法更不直观。
map