web-dev-qa-db-ja.com

group_by(複数の変数)を使用する場合のdplyrの問題

Ddplyの代わりにdplyrの使用を開始したいのですが、それがどのように機能するのか把握できません(ドキュメントを読みました)。

たとえば、mutate()をしようとすると、「group_by」関数が想定どおりに機能しないのはなぜですか?

Mtcarsを見る:

図書館(車)

「cyl」と「gear」でグループ化されたmtcarsの要約であるdata.frameを作成するとします。

df1 <- mtcars %.%
            group_by(cyl, gear) %.%
            summarise(
                newvar = sum(wt)
            )

次に、このデータフレームをさらに要約したいとします。 ddplyを使用すると、簡単になりますが、dplyrを使用する場合、実際には「グループ化」ではありません。

df2 <- df1 %.%
            group_by(cyl) %.%
            mutate(
                newvar2 = newvar + 5
            )

それでもグループ化されていない出力が生成されます。

  cyl gear newvar newvar2
1   6    3  6.675  11.675
2   4    4 19.025  24.025
3   6    4 12.375  17.375
4   6    5  2.770   7.770
5   4    3  2.465   7.465
6   8    3 49.249  54.249
7   4    5  3.653   8.653
8   8    5  6.740  11.740

構文に何か問題がありますか?


編集:

Plyrとddplyでこれを行う場合:

df1 <- ddply(mtcars, .(cyl, gear), summarise, newvar = sum(wt))

次に、2番目のdfを取得します。

df2 <- ddply(df1, .(cyl), summarise, newvar2 = sum(newvar) + 5)

しかし、summarise()関数でsum(newvar)+ 5を使用する同じアプローチは、dplyrでは機能しません...

45
Marc Tulla

Dickoaの答えをさらに一歩進めます-Hadleyが言うように、「要約はグループ化の単一レイヤーから剥がれます」。あなたがちょうど使用できるように、それはあなたがそれを適用した逆の順序からグループ化をはがします

mtcars %>%
 group_by(cyl, gear) %>%
 summarise(newvar = sum(wt)) %>%
 summarise(newvar2 = sum(newvar) + 5)

2行目にgroup_by(gear, cyl)を使用すると、これにより異なる答えが得られることに注意してください。

そして、最初の試みを機能させるには:

df1 <- mtcars %>%
 group_by(cyl, gear) %>%
 summarise(newvar = sum(wt))

df2 <- df1 %>%
 group_by(cyl) %>%
 summarise(newvar2 = sum(newvar)+5)
40
Tim Cameron

同様の問題がありました。単純にplyrをデタッチすると解決することがわかりました。

detach(package:plyr)    
library(dplyr)
64
ManneR

plyrの代わりにdplyrを使用してsummariseコードをmutateに変換すると、同じ結果が得られます。

library(plyr)
df1 <- ddply(mtcars, .(cyl, gear), summarise, newvar = sum(wt))
df2 <- ddply(df1, .(cyl), summarise, newvar2 = sum(newvar) + 5)
df2
##   cyl newvar2
## 1   4  30.143
## 2   6  26.820
## 3   8  60.989

detach(package:plyr)    
library(dplyr)
mtcars %.%
    group_by(cyl, gear) %.%
    summarise(newvar = sum(wt)) %.%
    group_by(cyl) %.%
    summarise(newvar2 = sum(newvar) + 5)
##   cyl newvar2
## 1   4  30.143
## 2   8  60.989
## 3   6  26.820

編集

summariseは最後のグループ(gear)をドロップするため、2番目のgroup_byをスキップできます(以下の@hadleyのコメントを参照)

library(dplyr)
mtcars %.%
    group_by(cyl, gear) %.%
    summarise(newvar = sum(wt)) %.%
    summarise(newvar2 = sum(newvar) + 5)
##   cyl newvar2
## 1   4  30.143
## 2   8  60.989
## 3   6  26.820
11
dickoa

dplyrは、例で予想されるとおりに機能しています。 Mutateは、指定したとおり、newvar2を作成するときに、newvarの各値に5を追加するだけです。グループ化してもしなくても、これは同じように見えます。ただし、グループごとに異なるものを指定すると、異なるものが得られます。例えば:

df1 %.%
            group_by(cyl) %.%
            mutate(
                newvar2 = newvar + mean(cyl)
            )
5
Vincent