2017-01-26 1 views
3

Я пытаюсь использовать dplyr для применения функции к кадру данных, который сгруппирован с использованием функции group_by. Я применяю функцию к каждой строке сгруппированных данных, используя do(). Я хотел бы получить значение переменной group_by, чтобы я мог использовать его в вызове функции.Как вы можете получить значение group_by для использования при передаче функции?

Таким образом, эффективно, я have-

tmp <- 
    my_data %>% 
    group_by(my_grouping_variable) %>% 
    do(my_function_call(data.frame(x = .$X, y = .$Y), 
         GROUP_BY_VARIABLE) 

Я уверен, что я мог бы назвать уникальным и получить его ...

do(my_function_call(data.frame(x = .$X, y = .$Y), 
        unique(.$my_grouping_variable)) 

Но, кажется неуклюжим и будет нерационально назвать уникальным для каждого значения группировки.

Есть ли способ получить значение переменной group_by в dplyr?

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

+0

Более эффективный, чем 'unique' (хотя и такой же неуклюжий), будет' first (. $ My_grouping_variable) '. Я бы посоветовал вам подумать об общих случаях - вы, кажется, считаете, что существует только одна переменная группировки, но, конечно же, вы могли бы группировать несколько столбцов разных классов. Предположительно, если бы существовала функция 'this_group()', ей нужно было бы вернуть именованный список или кадр данных одной строки с каждой переменной группировки и ее текущим значением. – Gregor

ответ

2

Прежде всего, если необходимо, проверьте, является ли это сгруппированным фреймом данных: inherits(data, "grouped_df").

Если вы хотите подмножества кадров данных, вы можете вложить группы:

mtcars %>% group_by(cyl) %>% nest() 

Как правило, вы будете не гнездятся внутри трубы цепи, но проверить в функции:

your_function(.x) <- function(x) { 
    if(inherits(x, "grouped_df")) x <- nest(x) 
} 

Ваша функция должна затем перебирать столбец списка data со всеми сгруппированными подмножествами. Если вы используете функцию внутри мутанта, например.

mtcars %>% group_by(cyl) %>% mutate(abc = your_function_call(.x)) 

то обратите внимание, что ваша функция непосредственно принимает значения для каждой группы, переданного в качестве класса structure. Это немного сложно объяснить, просто попробуйте и отлаживайте your_function_call шаг за шагом ...

0

Вы можете использовать groups(), однако версия SE этого не существует, поэтому я не уверен в ее использовании в программировании.

library(dplyr) 

df <- mtcars %>% group_by(cyl, mpg) 

groups(df) 

[[1]] 
cyl 

[[2]] 
mpg 
+0

Я думаю, что вы можете индексировать группы (df) [[i]] –

+0

Существует 'group_indicies()', если вы хотите индекс. –