Использование group_map для применения функции к каждой группе в сгруппированных столбцах - PullRequest
2 голосов
/ 15 мая 2019

Как использовать 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))

Но он продолжает говорить, что объект не найден.

Что я здесь не так делаю?

Ответы [ 2 ]

3 голосов
/ 15 мая 2019

Вы можете использовать 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

2 голосов
/ 15 мая 2019

Чтобы использовать 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
...