Цикл R, который проходит через список и вектор и объединяет элементы каждого

#r

#r

Вопрос:

Я пытаюсь подготовить уравнения для моделей. Для этого мне нужно объединить элементы списка (p переменных) и вектора (o переменных), чтобы получить следующее:

Для модели 1 o1 = p1 p2 p3

Для модели 2 o2=p2 p3

Я безуспешно пытался ниже:

 outcome <- c("o1", "o2")
predictor <- list(c("p1", "p2", "p3"),
                  c("p2", "p3"))
link=c("binomial", "gaussian")

try <- function(outcomes, predictors) {
   for(o in 1:length(outcome)) {
       eq <- paste(outcome[o], "~")
       for(p in predictor) {
         for(e in 1:length(p[[o]])) {
           eq=paste0(eq, p[[o]][[e]], " ")
           #print(eq)
         }
       }
     eq <- substr(eq,1,nchar(eq)-1)
     eq <- paste0(link[o], "-", eq)
         print(eq)
         }
     }

 try(outcome,predictor)

[1] "binomial-o1 ~p1 p2"
[1] "gaussian-o2 ~p2 p3"
 

Я пытаюсь получить:

 [1] "binomial-o1 ~p1 p2 p3"
[1] "gaussian-o2 ~p2 p3"
 

Ответ №1:

Используя purrr, вы можете сделать это следующим образом:

 library(purrr)
pmap(list(outcome, predictor,link), function(x,y,z) {
  
  paste0(z,"-",x, " ~", paste(y,collapse = " "))
  
})
 

Ответ №2:

Мы можем использовать Map

 Map(function(x, y, z) sprintf("%s-%s", z, 
   deparse(reformulate(x, response = y))), predictor, outcome, link)
 

-вывод

 #[[1]]
#[1] "binomial-o1 ~ p1   p2   p3"

#[[2]]
#[1] "gaussian-o2 ~ p2   p3"
 

Или аналогичная опция в for цикле.

 try_fn <- function(outcomes, predictors, links) {
   eq <- character(length(outcomes))
   for(i in seq_along(outcomes)){
       eq[i] <- sprintf("%s-%s", links[i], 
          deparse(reformulate(predictors[[i]], response = outcomes[i])))
      
      
     }
     
  return(eq)
  }

try_fn(outcome, predictor, link)
#[1] "binomial-o1 ~ p1   p2   p3" "gaussian-o2 ~ p2   p3"     
 

ПРИМЕЧАНИЕ: Вложенный for цикл не нужен, так как мы пытаемся создать формулу на основе соответствующих элементов. Поэтому просто перебирайте последовательность одного из элементов, т.Е. «Результат», используйте его в качестве индекса для подмножества других объектов, соответствующих элементам, создайте формулу с reformulate помощью и отформатируйте ее с помощью sprintf

Также Map выполняется то же самое, когда он создает формулу из каждого соответствующего элемента входных объектов и форматирует ее на sprintf основе элементов «link»