简体   繁体   中英

Using group_map to apply function to each group in grouped tibbles

How do I use group_map to apply a custom function to each group in a grouped tibble. I want to find the mean weight of each group in kg, and create a new column for each case. So every case in each group should have the same mean weight.

# custom function
meanKG = function(vector) {
  return(mean(vector, na.rm=TRUE) / 2.2)
}

df = mtcars %>% group_by(cyl)

# A tibble: 32 x 11
# Groups:   cyl [3]
     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
 * <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
 2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
 3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1
 4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1
 5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2
 6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
 7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
 8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2
 9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2
10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
# ... with 22 more rows

This is what I have tried:

df %>% group_map(~ meanKG(.wt))

But it keeps saying object.wt not found.

What am I doing wrong here?

You could use mutate in case this is what you want:

mtcars %>% group_by(cyl) %>% mutate(meanKG = meanKG(wt))

# A tibble: 32 x 12
# Groups:   cyl [3]
     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb meanKG
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl>
 1  21       6  160    110  3.9   2.62  16.5     0     1     4     4   1.42
 2  21       6  160    110  3.9   2.88  17.0     0     1     4     4   1.42
 3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1   1.04
 4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1   1.42
 5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2   1.82
 6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1   1.42
 7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4   1.82
 8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2   1.04
 9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2   1.04
10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4   1.42
# ... with 22 more rows

To use group_map you would need to return a tibble

meanKG = function(vector) {
  return(tibble::tibble(mean = mean(vector, na.rm=TRUE) / 2.2))
}

and then apply the function

library(dplyr)

mtcars %>%
  group_by(cyl) %>%
  group_map(~meanKG(.x$wt))

#     cyl  mean
#   <dbl> <dbl>
#1     4  1.04
#2     6  1.42
#3     8  1.82

I found that modifying this answer to use group_modify() instead of group_map() will give the desired result

library(dplyr)

mtcars %>%
  group_by(cyl) %>%
  group_modify(~meanKG(.x$wt))

# A tibble: 3 × 2
# Groups:   cyl [3]
    cyl  mean
  <dbl> <dbl>
1     4  1.04
2     6  1.42
3     8  1.82

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM