2014-10-22 4 views
4

Учитывая сгруппированный tbl, могу ли я извлечь одну/несколько групп? Такая функция может быть полезна при создании прототипов коды, например .:Как извлечь одну конкретную группу в dplyr

mtcars %>% 
    group_by(cyl) %>% 
    select_first_n_groups(2) %>% 
    do({'complicated expression'}) 

Конечно, можно сделать явный фильтр перед группировкой, но это может быть громоздкими.

+0

http://stackoverflow.com/questions/22182442/dplyr-how-to-apply-do-on-result-of- group-by – KFB

+2

В таблице данных вы можете использовать 'setDT (mtcars) [, .SD [.GRP% in% 1: 2], by = cyl]' – akrun

+0

@akrun С таким подходом у меня было, кажется, Правильный результат с предупреждающими сообщениями. 'mtcars%>% mutate (cyl = as.factor (cyl))%>% group_by (cyl)%>% filter (cyl == levels (cyl) [c (1,3)]) «Мне это смешно. Но любая идея? – jazzurro

ответ

7

Попробуйте это, где groups является вектором номеров групп. Здесь 1:2 означает первые две группы:

select_groups <- function(data, groups, ...) 
    data[sort(unlist(attr(data, "indices")[ groups ])) + 1, ] 

mtcars %>% group_by(cyl) %>% select_groups(1:2) 

Выбранные строки отображаются в оригинальном порядке. Если вы предпочитаете, чтобы строки отображались в том порядке, в котором указаны группы (например, в приведенных выше примерах строки первой группы, за которыми следуют строки второй группы), удалите sort.

+0

Спасибо. Это работает со следующими оговорками. Во-первых, поддерживается только база данных data.frame. Во-вторых, использование 'data [...]' снова группирует. Однако, поскольку вариант использования предполагает, что выбрано небольшое количество групп, это не должно быть проблемой. Я приму ответ, потому что кажется, что 'dplyr' не имеет таких встроенных функций. –

+0

@ Grothendieck - ваше решение действительно сегодня? есть ли что-то в 'dplyr', что прямо делает это? –

+0

Казалось, что он работает с dplyr 0.5 (самая последняя версия на CRAN), когда я вставлял код в ответ в R. Он дал строки, имеющие цилиндр = 4 или = 6 (первые две группы), как ожидалось. Если это не сработает для вас, попробуйте снова после перезапуска R из состояния ванили. –

2

С немного dplyr вместе с некоторой вложенностью/unnesting (поддерживается tidyr пакета), вы можете создать небольшую помощнику, чтобы получить первый (или любую) группу

first = function(x) x %>% nest %>% slice(1) %>% unnest(data) 
mtcars %>% group_by(cyl) %>% first() 

Регулейся нарезку вы могли также извлекайте n-й или любой диапазон групп по индексу, но обычно первое или последнее - это то, что большинство пользователей хотят.

Название вдохновлено функциональными API, которые все называют его first (см. Stdlibs i.e. kotlin, python, scala, java, spark).

Наверняка он также работает без вспомогательной функции непосредственно работает

mtcars %>% group_by(cyl) %>% nest %>% slice(1) %>% unnest(data) 
Смежные вопросы