web-dev-qa-db-ja.com

R、dplyr-group_by()とarrange()の組み合わせは期待した結果を生み出しませんか?

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),] )) )
33
Hrvoje

あなたが欲しいと思う

ToothGrowth %>%
  arrange(supp,len)

連鎖システムはネストされたコマンドを置き換えるだけなので、最初にグループ化し、次にそのグループ化された結果を順序付けます。これにより、元の順序が崩れます。

10
JeremyS

arrange.by_group = TRUEを設定することで、予期した動作を生成できます。

library(dplyr)
ToothGrowth %>%
    group_by(supp) %>%
    arrange(len, .by_group = TRUE)
32
David Rubinger

group_by()ステートメントを使用しながらこの予期しない注文の問題を修正する別の方法は、grouped_dfdata 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)
2
Paul Rougieux