【问题标题】:R for loop that passes only once though a vectorR for 循环只通过一个向量
【发布时间】:2021-04-18 19:56:19
【问题描述】:

我想先连接一个逻辑模型的方程,然后是一个线性模型。

对于模型1,o1=p1+p2+p3(二项式将输入到glm函数中的family参数)

对于模型2,o2=p1+p2+p3(glm函数中的family参数将输入高斯)

在现实生活中的例子中,会有更多的模型。

这是基本场景:

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)

输出:

[[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"

相反,我想要:

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

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

【问题讨论】:

  • 你为什么要这样做?我希望你不打算解析字符串。反正你不需要lapply,paste0是矢量化的。
  • 您的循环的问题是有 2 个循环!使用类似for(i in 1:length(outcome)) 的循环并在循环内使用outcome[i]link[i]。 (或下面的优秀答案之一。)

标签: r


【解决方案1】:

我们可以的

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

 }

-测试

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

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

【讨论】:

    【解决方案2】:

    也许try可以写成下面这样

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

    这样

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

    【讨论】:

      猜你喜欢
      • 2021-12-01
      • 2021-10-21
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      • 1970-01-01
      • 2020-01-29
      相关资源
      最近更新 更多