web-dev-qa-db-ja.com

R-ボックスプロットでの順序付け

[〜#〜] r [〜#〜]で一連の箱ひげ図を作成しようとしていますが、これは2つの要因でグループ化されています。私はなんとかプロットを作成できましたが、ボックスを正しい方向に並べることができません。

私が使用しているデータファームは次のようになります。

Nitrogen    Species    Treatment
2           G          L
3           R          M
4           G          H
4           B          L
2           B          M
1           G          H

私は試した:

boxplot(mydata$Nitrogen~mydata$Species*mydata$Treatment)

これにより、ボックスがアルファベット順に並べられました(最初の3つは「高」処理で、次にこれらの3つの中で、アルファベット順に種名で並べられました)。

alt text

ボックスプロットの順序は、Low> Medium> Highの順に設定し、次にこれらの各グループ内で、種のG> R> Bにします。

だから私は式で因子を使ってみました:

f = ordered(interaction(mydata$Treatment, mydata$Species), 
            levels = c("L.G","L.R","L.B","M.G","M.R","M.B","H.G","H.R","H.B")

その後:

boxplot(mydata$Nitrogen~f)

ただし、ボックスは同じ順序で引き続き動作します。ラベルは異なりますが、ボックスは移動していません。

各データセットを引き出して、それらをすべて個別にプロットしました。

lg = mydata[mydata$Treatment="L" & mydata$Species="G", "Nitrogen"]
mg = mydata[mydata$Treatment="M" & mydata$Species="G", "Nitrogen"]
hg = mydata[mydata$Treatment="H" & mydata$Species="G", "Nitrogen"]
etc ..

boxplot(lg, lr, lb, mg, mr, mb, hg, hr, hb)

これは私が望むものを提供しますが、よりエレガントな方法でこれを行うことを好むので、より大きなデータセットのためにそれぞれを個別に引き出す必要はありません。


ロード可能なデータ:

mydata <-
structure(list(Nitrogen = c(2L, 3L, 4L, 4L, 2L, 1L), Species = structure(c(2L, 
3L, 2L, 1L, 1L, 2L), .Label = c("B", "G", "R"), class = "factor"), 
    Treatment = structure(c(2L, 3L, 1L, 2L, 3L, 1L), .Label = c("H", 
    "L", "M"), class = "factor")), .Names = c("Nitrogen", "Species", 
"Treatment"), class = "data.frame", row.names = c(NA, -6L))
26
Robert

次のコマンドは、レベルを明示的に手動で並べ替えて、治療および種の要因を再構築することにより、必要な順序を作成します。

_mydata$Treatment = factor(mydata$Treatment,c("L","M","H"))

mydata$Species = factor(mydata$Species,c("G","R","B"))
_

alt text


編集1:おっと、LMHではなくHMLに設定しました。修正。

編集2:factor(X、Y)が行うこと:

既存の因子に対してfactor(X、Y)を実行する場合、Yの値の順序を使用して、因子Xに存在する値を列挙します。データの例を次に示します。

_> mydata$Treatment
[1] L M H L M H
Levels: H L M
> as.integer(mydata$Treatment)
[1] 2 3 1 2 3 1
> factor(mydata$Treatment,c("L","M","H"))
[1] L M H L M H                               <-- not changed
Levels: L M H                                 <-- changed
> as.integer(factor(mydata$Treatment,c("L","M","H")))
[1] 1 2 3 1 2 3                               <-- changed
_

ファクターが一見どのように見えるかは変わりませんが、データの保存方法は変わります。

ここで重要なのは、多くのプロット関数が一番左の列挙を左端にプロットし、その後に次のものが続くということです。

単にfactor(X)を使用して因子を作成する場合、通常、列挙は因子レベルのアルファベット順に基づいています(例:「H」、「L」、「M」)。ラベルにアルファベット順とは異なる従来の順序(つまり、「H」、「M」、「L」)がある場合、これによりグラフが奇妙に見える可能性があります。

一見すると、問題はデータフレーム内のデータの順序によるもののように思えるかもしれません。つまり、すべての「H」を上部に、「L」を下部に配置できる場合にのみ機能します。そうではありません。ただし、データ内で最初に出現するラベルと同じ順序でラベルを表示したい場合、次の形式を使用できます。

_ mydata$Treatment = factor(mydata$Treatment, unique(mydata$Treatment))
_
30
Alex Brown

この以前のStackOverflowの質問 は、数値に基づいてboxplotを並べ替える方法を示しています。ここで必要なのは、おそらくfactorから関連するタイプorderedへの切り替えだけです。ただし、データがなく、再現可能な例を提供しなかったため、断言できません。

Edit変数mdに投稿したデータセットを使用し、先ほど指摘したソリューションに依存して、

R> md$Species <- ordered(md$Species, levels=c("G", "R", "B"))
R> md$Treatment <- ordered(md$Treatment, levels=c("L", "M", "H"))
R> with(md, boxplot(Nitrogen ~ Species * Treatment))

これにより、作成しようとしていたチャートが作成されます。

これは、ここで紹介する他のソリューションと同等です。

11