Chris
Chris

Reputation: 41

How can you obtain the group_by value for use in passing to a function?

I am trying to use dplyr to apply a function to a data frame that is grouped using the group_by function. I am applying a function to each row of the grouped data using do(). I would like to obtain the value of the group_by variable so that I might use it in a function call.

So, effectively, I have-

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

I'm sure that I could call unique and get it...

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

But, it seems clunky and would inefficiently call unique for every grouping value.

Is there a way to get the value of the group_by variable in dplyr?

I'm going to prematurely say sorry if this is a crazy easy thing to answer. I promise that I've exhaustively searched for an answer.

Upvotes: 4

Views: 1537

Answers (2)

Jake Kaupp
Jake Kaupp

Reputation: 8072

You can use groups(), however a SE version of this does not exist so I'm unsure of its use in programming.

library(dplyr)

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

groups(df)

[[1]]
cyl

[[2]]
mpg

Upvotes: 0

Daniel
Daniel

Reputation: 7832

First, if necessary, check if it's a grouped data frame: inherits(data, "grouped_df").

If you want the subsets of data frames, you could nest the groups:

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

Usually, you won't nest within the pipe-chain, but check in your function:

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

Your function should then iterate over the list-column data with all grouped subsets. If you use a function within mutate, e.g.

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

then note that your function directly receives the values for each group, passed as class structure. It's a bit difficult to explain, just try it out and debug your_function_call step by step...

Upvotes: 2

Related Questions