【问题标题】:For i loop, calling different dataframesFor i 循环,调用不同的数据帧
【发布时间】:2023-04-05 05:04:01
【问题描述】:

我是循环新手,从第 i 个数据帧调用变量时遇到问题。

我能够正确调用每个数据帧,但是当我应该调用每个数据帧内的指定变量时,问题来了:

例子:

for (i in 1:15) {
    assign(
      paste("model", i, sep = ""), 
    (lm(response ~ variable, data = eval(parse(text = paste("data", i, sep = "")))))
    )
    plot(data[i]$response, predict.lm(eval(parse(text = paste("model", i, sep = ""))))) #plot obs vs preds
}

在这里,我做了 15 次简单的单变量线性模型,效果很好。当我尝试绘制结果时,问题就来了。我应该如何调用data[i] 响应?

【问题讨论】:

  • 你为什么使用assigneval?您可以使用列表来存储所有数据集。
  • 如果您是初学者并且发现自己使用assignevalparse,则很有可能在 R 中有更好的方法来执行此操作。如@VincentZoonekynd 指出,使用列表。
  • 你有这种循环结构的链接吗?我试图找到一些,但我不确定它们是否是我要找的。每个数据集 (n=15) 有 68 个变量和 284 个 obs。我还想更改我调用的变量。任何帮助表示赞赏。
  • 您应该使用lapply 进行循环。
  • data[i] 与名为“data”的对象不同,其中 表示数字或数字序列,

标签: r for-loop


【解决方案1】:

假设有多个名称为:data1 ...data15 的数据帧,并且没有其他以字母开头的数据对象:d,a,t,a。让我们还假设在每个数据框中都有名为“响应”和“变量”的列。这会将数据框收集到一个列表中,并为线性回归线绘制单独的图。

dlist <- lapply ( ls(patt='^data'), get)
lapply(dlist, function(df) 
                 plot(NA, xlim=range(df$variable), ylim=range(df$response)
                 abline( coef( lm(response ~ variable, data=df) ) )
         )

如果您想命名该列表中的数据框,您可以使用粘贴代码来提供名称:

names(dlist) <- paste("data", i, sep = "")

您可以在此循环的上下文中进行许多其他任务,但您需要更好地描述期望的结果,而不是失败的努力。

【讨论】:

    【解决方案2】:

    这是应该可以工作的修改后的代码。它执行一个变量 lm 模型并计算预测值和观察值的相关性并将其存储到一个空矩阵中。它还会绘制这些值。
    感谢托马斯的帮助。

    par(mfrow=c(4,5))
    results.matrix <- matrix(NA, nrow = 20, ncol = 2)
    colnames(results.matrix) <- c("Subset","Correlation")
    
    for (i in 1:length(datalist)) {
        model <- lm(response ~ variable, data = datalist[[i]])
        pred <- predict.lm(model)
        cor <- (cor.test(pred, datalist[[i]]$response))
        plot(pred, datalist[[i]]$response, xlab="pred", ylab="obs")
        results.matrix[i, 1] <- i
        results.matrix[i, 2] <- cor$estimate
    }
    

    【讨论】:

    • for (i in datalist) 应该是 for (i in 1:length(datalist))
    • model &lt;- lm(response ~ variable, data = i) 应该是model &lt;- lm(response ~ variable, data = datalist[[i]])
    • cor &lt;- (cor.test(pred, i$response) 应该是 cor &lt;- (cor.test(pred, datalist[[i]]$response)
    • 帮了大忙,非常感谢!
    • 您应该编辑您的答案以包含这些更改,以便它成为一个有效的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 2015-05-26
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 2021-03-04
    相关资源
    最近更新 更多