web-dev-qa-db-ja.com

動作しないグループ変数でgrouped_dfを配置する

クライアント名、年、および各年のいくつかの収益数を含むdata.frameがあります。

_df <- data.frame(client = rep(c("Client A","Client B", "Client C"),3), 
                 year = rep(c(2014,2013,2012), each=3), 
                 rev = rep(c(10,20,30),3)
                )
_

最終的には、クライアントと年ごとに収益を集計するdata.frameが必要です。次に、年ごとにdata.frameを並べ替えてから、収益を降順にします。

_library(dplyr)
df1 <- df %>% 
        group_by(client, year) %>%
        summarise(tot = sum(rev)) %>%
        arrange(year, desc(tot))
_

ただし、上記のコードを使用する場合、arrange()関数はグループ化されたdata.frameの順序をまったく変更しません。以下のコードを実行し、通常のdata.frameに強制すると、動作します。

_   library(dplyr)
    df1 <- df %>% 
            group_by(client, year) %>%
            summarise(tot = sum(rev)) %>%
            data.frame() %>%
            arrange(year, desc(tot))
_

グループ化された変数によってarrange grouped_dfを試行するたびに、何かを逃したり、これを行う必要がありますか?

Rバージョン:3.1.1 dplyrパッケージバージョン:0.3.0.2

EDIT 11/13/2017:lucacerone で述べたように、dplyr 0.5で始まるように、sortはソート時にグループをもう一度無視します。そのため、私の元のコードは、当初期待したとおりに動作します。

arrange()は再びグループ化を無視し、dplyr 0.3以前の動作に戻ります。これにより、arrange()は他のdplyr動詞と矛盾しますが、この動作は一般的にはより便利だと思います。とにかく、それが再び変化することはありません。より多くの変更がさらに混乱を引き起こすからです。

31
TBT8

_group_by_ステートメントの順序を切り替えてみてください:

_df %>% 
  group_by(year, client) %>%
  summarise(tot = sum(rev)) %>%
  arrange(year, desc(tot))
_

arrangeはグループ内で順序付けされていると思います。 summarizeの後、最後のグループは削除されるため、最初の例ではclientグループ内に行を配置します。順序をgroup_by(year, client)に切り替えると、clientグループがsummarizeの後に削除されるため、修正されるようです。

または、ungroup()関数があります

_df %>% 
  group_by(client, year) %>%
  summarise(tot = sum(rev)) %>%
  ungroup() %>%
  arrange(year, desc(tot))
_

編集、@ lucacerone: dplyr 0.5以降、これはもう機能しません:

変更を壊す場合、arrange()は再びグループ化を無視し、dplyr 0.3以前の動作に戻ります。これにより、arrange()が他のdplyr動詞と矛盾するようになりますが、この動作は一般により便利だと思います。とにかく、それが再び変化することはありません。より多くの変更がさらに混乱を引き起こすからです。

65
Kara Woo

dplyrの最新バージョン(少なくとも_dplyr_0.7.4_から)では、グループ内でarrangeを使用できます。 arrange()呼び出し_.by_group = TRUE_に設定しただけです。より多くの情報が利用可能です here あなたの例では、試してください:

_library(dplyr)
df %>% 
        group_by(client, year) %>%
        summarise(tot = sum(rev)) %>%
        arrange(desc(tot), .by_group = TRUE)
_
6
nghauran