【问题标题】:ggplot structuring data boxplot of treatment effects in multiple time periodsggplot 多时间段治疗效果的结构化数据箱线图
【发布时间】:2017-07-03 18:35:47
【问题描述】:

我目前的数据结构如下:

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 的不同分数。我正在尝试创建一个箱线图,以说明与数据集中每个唯一 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 个级别的分数差异...... 任何帮助我解决这个问题都会很棒。提前谢谢你

【问题讨论】:

标签: r ggplot2 boxplot melt


【解决方案1】:

复杂之处在于数据有成对的列(Treatment1、Score1 等)代表每个治疗/分数,我们需要跟踪给定受试者是否收到给定的Treatment 和他们的Score每次治疗。为此,我使用了 purrr 包(tidyverse 包套件的一部分)中的 map 函数之一。

代码遍历三对治疗/分数中的每一对,添加一个名为 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])
             })

现在我们在 x 轴上使用Treatment 绘制数据以标记治疗编号,并用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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 2013-04-24
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    相关资源
    最近更新 更多