Подтвердить что ты не робот

Как реплицировать поведение ddply, которое использует пользовательскую функцию с dplyr?

Я пытаюсь заменить все мои вызовы plyr на dplyr. Есть еще несколько коряг, и один из них имеет функцию group_by. Я полагаю, что он действует так же, как второй аргумент ddply, и выполняет разделение, применяет и объединяется на основе переменных группы, которые я перечисляю. Но, похоже, это не так. Вот довольно тривиальный пример.

Определим глупую функцию

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

Теперь мы можем разделить вид в наборе данных iris так и применить эту функцию к каждой части.

ddply(iris, .(Species), mm)

Это работает по назначению. Однако, когда я пытаюсь сделать то же самое с dplyr, он работает не так, как ожидалось.

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

Что я делаю неправильно?

4b9b3361

Ответ 1

Как показано в ?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(.))