Передать сгруппированные данные в собственную функцию в dplyr

Я пытаюсь перейти от plyr к dplyr. Тем не менее, я все еще не могу понять, как вызывать собственные функции в связанной функции dplyr.

У меня есть фрейм данных с факторизованной переменной ID и переменной порядка. Я хочу разделить кадр по идентификатору, упорядочить его по переменной порядка и добавить последовательность в новый столбец.

Мои функции plyr выглядят так:

f <- function(x) cbind(x[order(x$order_variable), ], Experience = 0:(nrow(x)-1))
data <- ddply(data, .(ID_variable), f)

В dplyr я, хотя это должно выглядеть примерно так

f <- function(x) cbind(x[order(x$order_variable), ], Experience = 0:(nrow(x)-1))
data <- data %>% group_by(ID_variable) %>% f

Может кто-нибудь сказать мне, как изменить мой вызов dplyr, чтобы успешно передать мою собственную функцию и получить ту же функциональность, которую обеспечивает моя функция plyr?

РЕДАКТИРОВАТЬ: Если я использую формулу dplyr, как описано здесь, он передает объект в f. Однако, в то время как plyr, кажется, пропускает несколько разных таблиц (разделенных по переменной ID), dplyr пропускает не одну таблицу на группу, а ВСЮ таблицу (как некоторый объект dplyr, где аннотируются группы), таким образом, когда я связываю Переменная опыта добавляет счетчик от 0 к длине всей таблицы вместо отдельных групп.

Я нашел способ получить ту же функциональность в dplyr, используя этот подход:

data <- data %>%
    group_by(ID_variable) %>%
    arrange(ID_variable,order_variable) %>% 
    mutate(Experience = 0:(n()-1))

Тем не менее, я все еще хотел бы научиться передавать сгруппированные переменные, разделенные на разные таблицы, собственным функциям в dplyr.

1 ответ

Для тех, кто попадает сюда из гугла. Допустим, вы написали свою собственную функцию печати.

printFunction <- function(dat) print(dat)
df <- data.frame(a = 1:6, b = 1:2)

Как это было задано здесь

df %>% 
    group_by(b) %>% 
    printFunction(.)

печатает все данные Чтобы получить dplyr распечатать несколько таблиц, сгруппированных по, вы должны использовать do

df %>% 
    group_by(b) %>% 
    do(printFunction(.))
Другие вопросы по тегам