dplyr関数group_by()
を使用し、その直後にarrange()
を使用すると、データフレームが順序付けられた出力が得られると期待しますwithingroup_by()
。ドキュメンテーションを読んだところ、この組み合わせでこのような結果が得られるはずですが、試してみたところ、私が得たものではなく、グーグルで他の人が同じ問題に遭遇したことを示していませんでした。この結果を期待するのは間違っていますか?
次に、R組み込みデータセットToothGrowthを使用した例を示します。
library(dplyr)
ToothGrowth %>%
group_by(supp) %>%
arrange(len)
これを実行すると、データフレーム全体がlen
係数内ではなくsupp
に従って順序付けられたデータフレームが生成されます。
これは、目的の出力を生成するコードです。
ToothGrowth %>%
group_by(supp) %>%
do( data.frame(with(data=., .[order(len),] )) )
あなたが欲しいと思う
ToothGrowth %>%
arrange(supp,len)
連鎖システムはネストされたコマンドを置き換えるだけなので、最初にグループ化し、次にそのグループ化された結果を順序付けます。これにより、元の順序が崩れます。
arrange
に.by_group = TRUE
を設定することで、予期した動作を生成できます。
library(dplyr)
ToothGrowth %>%
group_by(supp) %>%
arrange(len, .by_group = TRUE)
group_by()
ステートメントを使用しながらこの予期しない注文の問題を修正する別の方法は、grouped_df
をdata frame
に戻すことです。 group_byは、たとえば、要約に必要です。
ToothGrowthMeanLen <- ToothGrowth %>%
group_by(supp, dose) %>%
summarise(meanlen = mean(len))
この要約表は、平均の順に並べられていません
ToothGrowthMeanLen %>%
arrange(meanlen)
この要約表は、meanlenの順に配置されています
ToothGrowthMeanLen %>%
data.frame() %>% # Convert to a simple data frame
arrange(meanlen)
grouped_df
をデータフレームに戻す変換は、要約されたdata.frameをソートするために最初に見つけた方法です。しかし、実際にはdplyr::ungroup
はその目的のために存在します。
ToothGrowthMeanLen %>%
ungroup() %>% # Remove grouping
arrange(meanlen)