使用group_map将功能应用于分组小节中的每个组

时间:2019-05-15 07:54:41

标签: r function dplyr tibble

如何使用group_map将自定义函数应用于分组的小标题中的每个组。我想找到每组的平均重量(以千克为单位),并为每种情况创建一个新列。因此,每组中的每个病例均应具有相同的平均体重。

# 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

这是我尝试过的:

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

但是它一直说找不到对象.wt。

我在这里做什么错了?

2 个答案:

答案 0 :(得分:3)

您可以使用mutate,以防万一:

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

答案 1 :(得分:2)

要使用group_map,您需要返回一个小标题

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

然后应用功能

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