如何使用dplyr复制使用自定义函数的ddply行为?

时间:2014-06-10 05:16:35

标签: r dplyr

我正在尝试用plyr替换所有dplyr次来电。仍然存在一些障碍,其中一个具有group_by功能。我想它的行为与第二个ddply参数的行为相同,并根据我列出的分组变量进行拆分,应用和组合。但事实似乎并非如此。这是一个相当简单的例子。

让我们定义一个愚蠢的函数

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

现在我们可以像这样分割iris数据集中的物种,并将此函数应用于每个部分。

ddply(iris, .(Species), mm)

这是按预期工作的。但是,当我使用dplyr尝试相同时,它无法按预期工作。

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

我做错了什么?

2 个答案:

答案 0 :(得分:35)

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

答案 1 :(得分:0)

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