我如何将列名添加到 R 中的 for 循环

How do i add column names to my for-loop in R

我对 运行 回归模型的所有可能组合进行了循环。因为我只需要保留模型的残差,所以我这样做了:

df <- data.frame(t(combn(colnames(orig_df), m = 2)))

test = NULL
for (i in 1:(nrow(df)-1)) {
  for (j in (i+1):nrow(df)) {
    x <- lm(orig_df[[i]] ~ orig_df[[j]], data = orig_df)
    y <- x$residuals
    test <- cbind(test, y)
  }
}

但是,我的问题是向新数据框添加名称(此处命名为“test”)。我认为区分残差的一个好方法是添加 x$call[2]。 但是,如果我创建循环以便:

test = NULL
for (i in 1:(nrow(df)-1)) {
  for (j in (i+1):nrow(df)) {
    x <- lm(orig_df[[i]] ~ orig_df[[j]], data = Telekom)
    y <- x$residuals
    test <- cbind(test, y)
    colnames(test) <- paste(x$call[2])  
  }
}

在此之后循环停止正常工作,显示的错误是: length of 'dimnames' [2] not equal to array extent 。我这里的错误是什么?

提前致谢!

第一个循环:

第二个循环:

问题可以通过 mtcars 数据重现

> model <- lm(mtcars[[1]] ~ mtcars[[2]])
> model$call
lm(formula = mtcars[[1]] ~ mtcars[[2]])

之后我们可能会分配 call

> model$call[[2]] <- as.formula(paste0(names(mtcars)[1], "~ ", names(mtcars)[2]))
> model$call
lm(formula = mpg ~ cyl)

在 OP 的循环中,这个修改可能会起作用

test = NULL
for (i in 1:(nrow(df)-1)) {
  for (j in (i+1):nrow(df)) {
    x <- lm(orig_df[[i]] ~ orig_df[[j]], data = Telekom)
    x$call[[2]] <- as.formula(paste0(names(orig_df)[i], "~ ", names(orig_df)[j])))
    y <- x$residuals
    test <- cbind(test, y)
    colnames(test)[ncol(test)] <- paste(x$call[[2]])  
  }
}