Вот то, что я думаю, делает то, что вы предлагаете.
library(dplyr)
Создайте некоторые данные.
set.seed(1234)
data <- tibble(id = rep(letters[1:2], each = 3), price = rnorm(6, 100, 5))
data
# # A tibble: 6 x 2
# id price
# <chr> <dbl>
# 1 a 94.0
# 2 a 101.
# 3 a 105.
# 4 b 88.3
# 5 b 102.
# 6 b 103.
Создайте список функций. Обратите внимание, что мы назвали элемент списка для id
, к которому мы хотим применить его.
myFunctions <- list(
a = mean,
b = median
)
Сгруппируйте данные по id
. Затем выполните итерацию по каждому элементу списка, вызывая summarize()
. Для каждого списка (который является подмножеством данных для данного id
) вызовите функцию из списка myFunctions
.
data %>%
group_by(id) %>%
group_modify(~ summarize(.x, calc = myFunctions[[pull(.y[1])]](.x$price)))
# # A tibble: 2 x 2
# id calc
# <chr> <dbl>
# 1 a 100.
# 2 b 102.
Тестирование.
> mean(data$price[data$id == "a"])
[1] 100.258
> median(data$price[data$id == "b"])
[1] 102.1456