Передать сгруппированные данные в собственную функцию в 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(.))