EML
EML

Reputation: 671

R for loop that passes only once though a vector

I would like to concatenate an equation for a logistic model first followed by a linear model.

For model 1, o1=p1+p2+p3 (binomial will be input to family parameter in glm function)

For model 2, o2=p1+p2+p3 (gaussian will be input to family parameter in glm function)

In the real life example, there will be many more models.

Here is the basic scenario:

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


try <- function(outcomes, predictors) {
for(o in outcome) {
  eq <- paste(o, "~")
  for(p in predictor) {
    eq=paste0(eq, p, "+")
  }
  # remove extra +
eq <- substr(eq,1,nchar(eq)-1)

# model will go here
eq <- lapply(link, function(x) paste0(x, " - ", eq))
print(eq)
}
}

try(outcomes=outcome, predictors=predictor)

Output:

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

[[2]]
[1] "gaussian - o1 ~p1+p2+p3"

[[1]]
[1] "binomial - o2 ~p1+p2+p3"

[[2]]
[1] "gaussian - o2 ~p1+p2+p3"

Instead, I want:

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

[1] "gaussian - o2 ~p1+p2+p3"

Upvotes: 0

Views: 50

Answers (2)

akrun
akrun

Reputation: 887203

We can do

try1 <- function(outcomes, predictors) {
      Map(function(x, y) paste(y, '-', 
            deparse(reformulate(predictors, x))), outcomes, link)   

 }

-testing

try1(outcomes=outcome, predictors=predictor)
#$o1
#[1] "binomial - o1 ~ p1 + p2 + p3"

#$o2
#[1] "gaussian - o2 ~ p1 + p2 + p3"

Upvotes: 1

ThomasIsCoding
ThomasIsCoding

Reputation: 101638

Maybe try can be written like below

try <- function(outcomes, predictors) {
  as.list(
    paste0(
      do.call(
        paste,
        c(data.frame(link, outcomes), sep = " - ")
      ),
      paste0(" ~ ", paste0(predictors, collapse = " + "))
    )
  )
}

such that

> try(outcome, predictor)
[[1]]
[1] "binomial - o1 ~ p1 + p2 + p3"

[[2]]
[1] "gaussian - o2 ~ p1 + p2 + p3"

Upvotes: 1

Related Questions