Запускать функции, хранящиеся в списке на основе критериев - PullRequest
1 голос
/ 25 февраля 2020

У меня есть список функций, например:

    myFunctions = list(
         calculateMean = function(x) {mean(x)},
         calculateMedian = function(x) {median(x)}
         )

Мне нужно вызвать сохраненный functions в myFunctions на основе некоторых критериев, например, у меня есть таблица (myTable) с ценами и мне нужно рассчитать средние и медианы (мне также нужно сделать больше вещей, например стандартизировать имена, объединить значение спецификаций c с таблицей с кодами и т. д. c).

Если значение в столбце в myTable равно == "a" Я хочу использовать функцию calculateMean, если == "b" Я хочу использовать функцию calculateMedian, если == "c" использовать функцию calculateMean.

Каков наилучший способ сделать это? Я сохраняю функции в виде списка, так как у меня будет много функций. И как я могу вызвать функцию в myFunctions на основе определенных c критериев?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

Может быть, следующий вопрос делает то, что просит.

В зависимости от ID функция priceStat определяет, какую функцию из myFunctions применять к столбцу price.

priceStat <- function(x, funlist) {
  type <- unique(as.character(x[["ID"]]))
  f <- switch(type,
              pear = funlist[[1]],
              orange = funlist[[2]])
  f(x[["price"]])
}

myFunctions = list(
  calculateMean = function(x) {mean(x)},
  calculateMedian = function(x) {median(x)}
)

set.seed(1234)
df1 <- data.frame(ID = sample(c("pear", "orange"), 20, TRUE),
                  price = runif(20),
                  stringsAsFactors = FALSE)

sapply(split(df1, df1$ID), priceStat, myFunctions)
#   orange      pear 
#0.3036828 0.5427695 
1 голос
/ 25 февраля 2020

Вот то, что я думаю, делает то, что вы предлагаете.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...