web-dev-qa-db-ja.com

dplyrでカスタム関数を使用するddply動作を複製する方法は?

すべてのplyr呼び出しをdplyrに置き換えようとしています。まだいくつかの障害があり、そのうちの1つはgroup_by 関数。私はそれが2番目のddply引数と同じように動作し、リストしたグループ化変数に基づいて分割、適用、結合を行うと想像します。しかし、そうではないようです。これはかなり自明な例です。

愚かな関数を定義しましょう

mm <- function(x) return(x[1:5, ])

これで、種をirisdatasetでそのように分割し、この関数を各部分に適用できます。

ddply(iris, .(Species), mm)

これは意図したとおりに機能します。ただし、dplyrを使用して同じことを実行すると、期待どおりに動作しません。

iris %>% group_by(Species) %>% mm

何が悪いのですか?

34
Maiasaura

?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(.))
35
jbaums

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
0