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では機能しません...
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)
同様の問題がありました。単純にplyr
をデタッチすると解決することがわかりました。
detach(package:plyr)
library(dplyr)
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
dplyrは、例で予想されるとおりに機能しています。 Mutateは、指定したとおり、newvar2を作成するときに、newvarの各値に5を追加するだけです。グループ化してもしなくても、これは同じように見えます。ただし、グループごとに異なるものを指定すると、異なるものが得られます。例えば:
df1 %.%
group_by(cyl) %.%
mutate(
newvar2 = newvar + mean(cyl)
)