r for循环聚合导致矩阵

时间:2017-03-11 22:43:31

标签: r for-loop matrix

我正在尝试进行50次for loop次,每次生成三列和13行数据,我将其存储在矩阵中,因此最终产品应该有13行但是150列。也就是说,每次for loop结果都会聚合到前一个结果的右侧。 这是我的尝试:

predict.data<-matrix(nrow=13,ncol = 150)
for (i in 1:50){
  x <- rnorm(15)
  y <- x + rnorm(15)
  new <- data.frame(x = seq(-3, 3, 0.5))

  for (j in 1:nrow(new)){ 
    predict.data[j,] <- predict(lm(y ~ x), new, interval = "prediction")
    colnames(predict.data) <- paste(c("fit", "lwr","upr"), 1:50)
  }
}

但是我收到以下错误:

  number of items to replace is not a multiple of replacement length

也许我在代码的某个地方错过了一点。 我还需要连续粘贴列名:fit1,lwr1,upr1,fit2,lwr2,upr2,...

有人可以帮助我纠正和调整这个

预期结果将类似于:

fit1    lwr1    upr1    fit2    lwr2    upr2    …   fit50   lwr50   upr50
1,81    1,76    1,44    1,22    1,70    1,14    …   1,97    1,45    1,16
1,67    1,46    1,52    1,89    1,43    1,02    …   1,86    1,38    1,69
1,73    1,76    1,53    1,35    1,44    1,74    …   1,92    1,22    1,01
1,72    1,89    1,12    1,55    1,81    1,21    …   1,47    1,79    1,99
1,30    1,30    1,04    1,07    1,07    1,95    …   1,20    1,08    1,59
1,64    1,94    1,73    1,10    1,59    1,28    …   1,89    1,62    1,14
2,00    1,56    1,24    1,10    1,50    1,16    …   1,59    1,25    1,88
1,64    1,03    1,58    1,84    1,57    1,33    …   1,96    1,75    1,01
1,50    1,51    1,64    1,32    1,46    1,10    …   1,71    1,68    1,35
1,94    1,50    1,28    1,64    1,90    1,54    …   1,25    1,51    1,96
1,24    1,67    1,74    1,21    1,29    1,81    …   1,63    1,91    1,82
1,81    1,90    1,28    1,85    1,59    1,13    …   1,55    1,25    1,98
1,35    1,12    1,26    1,52    1,25    1,46    …   1,75    1,84    1,09

新更新

new是矩阵而不是lm我从包“glmnet”获得cv.glmnet时,我遇到了另一个问题。我只得到最终结果三分之一的数据,即只有50列而不是150列。并且这些列号不再正确。

2 个答案:

答案 0 :(得分:1)

这会有用......

library(magrittr) # sorry I like pipes

predict.data <- list() # versitle across data structures

for (i in 1:50){

    x <- rnorm(15)
    y <- x + rnorm(15)
    new <- data.frame(x = seq(-3, 3, 0.5))

    predict.data[[i]] <- predict(lm(y ~ x), new, interval = "prediction") %>%
                     magrittr::set_colnames(., paste0(colnames(.), i))

}

predict.data %<>% do.call(cbind, .) # make your wide matrix

答案 1 :(得分:0)

使用基础R.我使用cbind

predict.data<-NULL  #empty object
for (i in 1:50){
  x <- rnorm(15)
  y <- x + rnorm(15)
  new1 <- data.frame(x = seq(-3, 3, 0.5))

  for (j in 1:nrow(new1)){
    res <- predict(lm(y ~ x), new1, interval = "prediction")
    colnames(res) <- paste0(c("fit", "lwr","upr"), i)
    predict.data<-cbind(predict.data,res)
  }
}