すべてのplyr
呼び出しをdplyr
に置き換えようとしています。まだいくつかの障害があり、そのうちの1つはgroup_by
関数。私はそれが2番目のddply
引数と同じように動作し、リストしたグループ化変数に基づいて分割、適用、結合を行うと想像します。しかし、そうではないようです。これはかなり自明な例です。
愚かな関数を定義しましょう
mm <- function(x) return(x[1:5, ])
これで、種をiris
datasetでそのように分割し、この関数を各部分に適用できます。
ddply(iris, .(Species), mm)
これは意図したとおりに機能します。ただし、dplyr
を使用して同じことを実行すると、期待どおりに動作しません。
iris %>% group_by(Species) %>% mm
何が悪いのですか?
?do
に示すように、式で.
を使用してグループを参照できます。以下はddply
出力を複製します:
iris %>% group_by(Species) %>% do(.[1:5, ])
# Source: local data frame [15 x 5]
# Groups: Species
#
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 5.1 3.5 1.4 0.2 setosa
# 2 4.9 3.0 1.4 0.2 setosa
# 3 4.7 3.2 1.3 0.2 setosa
# 4 4.6 3.1 1.5 0.2 setosa
# 5 5.0 3.6 1.4 0.2 setosa
# 6 7.0 3.2 4.7 1.4 versicolor
# 7 6.4 3.2 4.5 1.5 versicolor
# 8 6.9 3.1 4.9 1.5 versicolor
# 9 5.5 2.3 4.0 1.3 versicolor
# 10 6.5 2.8 4.6 1.5 versicolor
# 11 6.3 3.3 6.0 2.5 virginica
# 12 5.8 2.7 5.1 1.9 virginica
# 13 7.1 3.0 5.9 2.1 virginica
# 14 6.3 2.9 5.6 1.8 virginica
# 15 6.5 3.0 5.8 2.2 virginica
より一般的には、カスタム関数をdplyr
のグループに適用するには、次のようにします(@docendodiscimusに感謝します)。
iris %>% group_by(Species) %>% do(mm(.))
slice
がこのために作成されました:
library(dplyr)
iris %>% group_by(Species) %>% slice(1:5)
#> # A tibble: 15 x 5
#> # Groups: Species [3]
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#> <dbl> <dbl> <dbl> <dbl> <fct>
#> 1 5.1 3.5 1.4 0.2 setosa
#> 2 4.9 3 1.4 0.2 setosa
#> 3 4.7 3.2 1.3 0.2 setosa
#> 4 4.6 3.1 1.5 0.2 setosa
#> 5 5 3.6 1.4 0.2 setosa
#> 6 7 3.2 4.7 1.4 versicolor
#> 7 6.4 3.2 4.5 1.5 versicolor
#> 8 6.9 3.1 4.9 1.5 versicolor
#> 9 5.5 2.3 4 1.3 versicolor
#> 10 6.5 2.8 4.6 1.5 versicolor
#> 11 6.3 3.3 6 2.5 virginica
#> 12 5.8 2.7 5.1 1.9 virginica
#> 13 7.1 3 5.9 2.1 virginica
#> 14 6.3 2.9 5.6 1.8 virginica
#> 15 6.5 3 5.8 2.2 virginica