Все возможные спецификации аргументов для функции в R

#r #function #loops #combinatorics

Вопрос:

У меня есть функция со следующей формой:

 model <- Create(parameter1 = list(model = "a" , "b"),
                parameter2 = list(distribution = "x" , "y"))
 

Я хочу создать все возможные спецификации для этой «модели», используя функцию выше.

Возможные значения для parameter1 и parameter2 являются:

 parameter1: "a", "b", "c", "d", "e"
 

и

 parameter2: "x", "y", "z", "w", "t", "v"
 

Я пытался использовать for петлю, но пока это не сработало.

Любая помощь будет очень признательна.

Комментарии:

1. Являются моделью, распределение принимает два значения одновременно

2. @akrun Да, всегда два значения одновременно. Могут быть повторяющиеся значения.

3. библиотека(tidyr) параметр1 <- c(«a», «b», «c», «d», «e») параметр2

Ответ №1:

Мы можем использовать combn для создания парных комбинаций каждого «параметра»,

  d1 <- expand.grid(parameter1, parameter1, stringsAsFactors = FALSE)

 d2 <- expand.grid(parameter2, parameter2, stringsAsFactors = FALSE)
 names(d2) <- c("Var3", "Var4")
 

затем с expand.grid помощью или crossing разверните оба созданных набора данных

 library(tidyr)
parameter_dat <- crossing(d1, d2)
str(parameter_dat)
tibble [900 × 4] (S3: tbl_df/tbl/data.frame)
 $ Var1: chr [1:900] "a" "a" "a" "a" ...
 $ Var2: chr [1:900] "a" "a" "a" "a" ...
 $ Var3: chr [1:900] "t" "t" "t" "t" ...
 $ Var4: chr [1:900] "t" "v" "w" "x" ...
 

Выполните цикл по строкам набора данных и примените функцию

 library(purrr)
pmap(parameter_dat, ~ Create(parameter1 = list(model = c(..1, ..2)),
                parameter2 = list(distribution = c(..3, ..4))))
 

данные

 parameter1 <- c("a", "b", "c", "d", "e")
parameter2 <- c("x", "y", "z", "w", "t", "v")
 

Комментарии:

1. единственная проблема с этим решением заключается в том, что оно игнорирует случай повторяющихся значений. Например, мы можем иметь: модель

2. @MiguelMoreira Я думаю, что вы не выполнили строку выше library(tidyr); parameter_dat <- crossing(d1, d2)

3. @MiguelMoreira если вы сделаете это, вы получите измерение dim(parameter_dat) [1] 900 4

4. Спасибо!! Работал очень хорошо, просто нужно было преобразовать коэффициенты в символы в параметре_dat.

5. @MiguelMoreira они вам не нужны, потому expand.grid что могут возвращать символьные столбцы, сами по себе, если использовать stringsAsFactors = FALSE (по умолчанию он возвращает значение TRUE), т. Е. нам не нужен дополнительный код, когда мы можем устранить основную причину