2017-07-03 4 views
1

私は現在、そうのような構造のデータを有する:ggplot構造化データの箱ひげ図

それらがあれば、所与の処置および0を受信した場合は1を符号化された固有のID、3つの異なる処理が(ある
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ごとに各治療期間に関連付けられたスコア分布を示すボックスプロットを作成しようとしていますが、データを適切に解消していないか、適切にまたは両方をプロットしていません。

d.melt<-melt(d,id.vars = c("ID","Treatment1","Treatment2","Treatment3"),measure.vars = c("Score1","Score2","Score3")) 

私は、彼らがこのコードの3つの処理のいずれかを受け取ったかどうかで区切られたスコアを示す箱ひげ図を生成することができます

ggplot(d.melt)+ 
    geom_boxplot(aes(x = variable,y = value,fill = factor(Treatment1))) 

をしかし、これはのみのために、すべての得点に差をプロットしますIDは治療1を受け、3つのレベルのすべてのスコアの差ではありません... この問題の周りに私の頭を上げる助けがあれば素晴らしいでしょう。

+0

あなたがすでに行っていることを 'facet_grid'と組み合わせてもいいかもしれません。 – ulfelder

+0

これがあなたの望むものであるかどうかわからない:https://stackoverflow.com/questions/14604439/plot-multiple-boxplot-in-one-graph –

答えて

1

各治療/スコアを表す列(Treatment1、Score1など)がデータに含まれており、与えられた被験者が特定のTreatmentScoreを受け取ったかどうかを追跡する必要があります。各治療について。私はこれのためにパッケージの一部であるpurrrパッケージのmap関数のうちの1つを使用しました。

コードは、3つの対の処理/スコアのそれぞれを処理し、治療番号を示す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]) 
      }) 

今、与えられた対象が与えられた治療を受けたかどうかに基づいて別々のボックスプロットを提供するTreat_Flagによって処理番号と色をマークするためにx軸上Treatmentを用いてデータをプロットします。

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

enter image description here

ここでデータを再構築するための別の方法です。以下のコードでは、reshape2(はreshape2の後継)ではなく、tidyrの関数を使用しています。以下のコードでは、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) 
+0

ありがとう –

関連する問題