2015-01-28 2 views
2

Я пытаюсь перейти от plyr к dplyr. Тем не менее, я все еще не могу понять, как вызвать собственные функции в цепочке функции 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?

EDIT: Если я использую формулу dplyr, как описано здесь, она передает объект в f. Однако, хотя plyr, кажется, передает несколько разных таблиц (разделенных переменной ID), dplyr не передает одну таблицу для каждой группы, а таблицу ENTIRE (как некоторый объект dplyr, где аннотируются группы), поэтому, когда я привязываю Переменная опыта добавляет счетчик от 0 до длины всей таблицы вместо отдельных групп.

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

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

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

+1

Какую версию R и 'dplyr' вы используете? Это не привело к ошибке для меня. – nrussell

+4

Я думаю, нам нужен воспроизводимый набор данных. @nrussell Я не думаю, что проблема связана с ошибкой, а не с ожидаемым/ожидаемым результатом. Я нашел этот вопрос из-за моей собственной аналогичной проблемы. Я сделал что-то очень похожее 'd%>% group_by (var1, var2)%>% summary (blah = f (.))'. Я получаю возвращаемый массив данных группы, но каждая запись для 'blah' идентична. Я думаю, что это так, как описано выше; по какой-то причине вся df передается, а не сгруппированные «куски», подобные «plyr». – Hendy

ответ

2

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

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(.)) 
Смежные вопросы