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
中的函数(tidyr
是 reshape2
的继承者)。在下面的代码中,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)
我目前的数据结构如下:
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
中的函数(tidyr
是 reshape2
的继承者)。在下面的代码中,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)