web-dev-qa-db-ja.com

因子レベルをきちんと並べ替える方法は?

こんにちは私は通常、次のようなコードを使用して、ggplotまたは他のタイプのプロットのバーを並べ替えます。

通常のプロット(順不同)

_library(tidyverse)
iris.tr <-iris %>% group_by(Species) %>% mutate(mSW = mean(Sepal.Width)) %>%
  select(mSW,Species) %>% 
  distinct()
ggplot(iris.tr,aes(x = Species,y = mSW, color = Species)) +
  geom_point(stat = "identity")
_

因子の順序+順序付きプロット

_iris.tr$Species <- factor(iris.tr$Species,
                          levels = iris.tr[order(iris.tr$mSW),]$Species,
                          ordered = TRUE)
ggplot(iris.tr,aes(x = Species,y = mSW, color = Species)) + 
  geom_point(stat = "identity")
_

因子の行は私にとって非常に不快です。なぜarrange()または他の関数がこれを単純化できないのでしょうか。何か不足していますか?

注:

これは機能しませんが、tidyverseにこのようなものが存在するかどうかを知りたいです。

_iris.tr <-iris %>% group_by(Species) %>% mutate(mSW = mean(Sepal.Width)) %>%
  select(mSW,Species) %>% 
  distinct() %>% 
  arrange(mSW)
ggplot(iris.tr,aes(x = Species,y = mSW, color = Species)) + 
  geom_point(stat = "identity")
_
8
David Mas

Using forcats ›の使用:

iris.tr %>%
    mutate(Species = fct_reorder(Species, mSW)) %>%
    ggplot() +
    aes(Species, mSW, color = Species) +
    geom_point()
17
Konrad Rudolph

Baseを使用して係数を並べ替えます:

iris.ba = iris
iris.ba$Species = with(iris.ba, reorder(Species, Sepal.Width, mean))

dplyrへの翻訳:

iris.tr = iris %>% mutate(Species = reorder(Species, Sepal.Width, mean))

その後、引き続き質問のように要約してプロットできます。


いくつかのコメント:因子の並べ替えはデータ列の変更です。データ列を変更するdplyrコマンドはmutateです。 arrangeが行うのは行の並べ替えだけです。これは因子のレベルに影響を与えないため、ggplotの凡例または軸の順序には影響を与えません。

すべての要因には、レベルの順序があります。 ordered = TRUE係数と通常の係数の違いは、モデルでのコントラストの設定方法です。 ordered = TRUEは、因子レベルに「低」、「中」、「高」などの意味のあるランク順序がある場合にのみ使用する必要があります。さらに、モデルを構築していて、デフォルトでは、すべてを参照レベルと比較します。

5
Gregor Thomas

たとえば、注文する文字ベクトルがあるとします。

iris2 <- iris %>% 
    mutate(Species = as.character(Species)) %>% 
    group_by(Species) %>% 
    mutate(mSW = mean(Sepal.Width)) %>% 
    ungroup()

Forcats :: as_factor 関数の動作を使用して、因子レベルを順序付けることもできます。

「ベースRと比較して、この関数は出現順にレベルを作成します」

library(forcats)
iris2 %>% 
    arrange(mSW) %>%  
    mutate(Species = as_factor(Species)) %>%
    ggplot() +
    aes(Species, mSW, color = Species) +
    geom_point()
0
Paul Rougieux