首页 > 解决方案 > 在循环中填充多个矩阵,使用矩阵的名称为循环的每次迭代选择不同的矩阵?

问题描述

我认为这个问题的答案很容易,但老实说我找不到解决方案。我使用assign()paste()函数来创建 25 个带有 LOOP 的空矩阵,更改名称中的数字。因此,矩阵的名称是: ReturnMat_InSampleL24,...,ReturnMat_InSampleL48

我知道我可以使用get()它来循环打印这些矩阵。

关键是我需要找到一种方法来通过单个循环修改这些矩阵(然后将其放置在其他矩阵中,但现在应该没关系)

所以我想实现类似:

for (i in 1:25) {ReturnMat_InSampleLi[] = ...}

但当然不能这样工作,我们不能i在循环内的名称中添加一个。

这是矩阵的代码,以防万一:

InSamplePeriodLenghtTest = matrix(c((24:48)),ncol = 1)  
OutSamplePeriodLenghtTest = InSamplePeriodLenghtTest
PeriodsNumber1 = 170    
FactorsNumber = 8

for (i in 1:(nrow(InSamplePeriodLenghtTest))) {

  assign(paste("ReturnMat_InSampleL",InSamplePeriodLenghtTest[i],sep=""),
         matrix(c(rep(NA,(1+InSamplePeriodLenghtTest[i]) * FactorsNumber * ((PeriodsNumber1-1-InSamplePeriodLenghtTest[i])-(InSamplePeriodLenghtTest[i] * 2)+1))),
                                                       ncol = FactorsNumber)) }

标签: rloopsfor-loopmatrix

解决方案


我不确定我是否完全理解了 OP 的意图,但这就是我会做的。

我不会在全局环境中创建 25 个矩阵,而是将所有矩阵存储在一个列表(lom也称为矩阵列表)中,它们可以单独处理,也可以通过以下方式作为一个整体处理lapply()

FactorsNumber <- 8
lom <- lapply(24:48, function(i) matrix(NA, ncol = FactorsNumber, nrow = i))
names(lom) <- sprintf("ReturnMat_InSampleL%02i", seq_along(lom))
str(lom)
List of 25
 $ ReturnMat_InSampleL01: logi [1:24, 1:8] NA NA NA NA NA NA ...
 $ ReturnMat_InSampleL02: logi [1:25, 1:8] NA NA NA NA NA NA ...
 $ ReturnMat_InSampleL03: logi [1:26, 1:8] NA NA NA NA NA NA ...
 $ ReturnMat_InSampleL04: logi [1:27, 1:8] NA NA NA NA NA NA ...
 $ ReturnMat_InSampleL05: logi [1:28, 1:8] NA NA NA NA NA NA ...
 $ ReturnMat_InSampleL06: logi [1:29, 1:8] NA NA NA NA NA NA ...
 $ ReturnMat_InSampleL07: logi [1:30, 1:8] NA NA NA NA NA NA ...
 $ ReturnMat_InSampleL08: logi [1:31, 1:8] NA NA NA NA NA NA ...
 $ ReturnMat_InSampleL09: logi [1:32, 1:8] NA NA NA NA NA NA ...
 $ ReturnMat_InSampleL10: logi [1:33, 1:8] NA NA NA NA NA NA ...
 $ ReturnMat_InSampleL11: logi [1:34, 1:8] NA NA NA NA NA NA ...
 $ ReturnMat_InSampleL12: logi [1:35, 1:8] NA NA NA NA NA NA ...
 $ ReturnMat_InSampleL13: logi [1:36, 1:8] NA NA NA NA NA NA ...
 $ ReturnMat_InSampleL14: logi [1:37, 1:8] NA NA NA NA NA NA ...
 $ ReturnMat_InSampleL15: logi [1:38, 1:8] NA NA NA NA NA NA ...
 $ ReturnMat_InSampleL16: logi [1:39, 1:8] NA NA NA NA NA NA ...
 $ ReturnMat_InSampleL17: logi [1:40, 1:8] NA NA NA NA NA NA ...
 $ ReturnMat_InSampleL18: logi [1:41, 1:8] NA NA NA NA NA NA ...
 $ ReturnMat_InSampleL19: logi [1:42, 1:8] NA NA NA NA NA NA ...
 $ ReturnMat_InSampleL20: logi [1:43, 1:8] NA NA NA NA NA NA ...
 $ ReturnMat_InSampleL21: logi [1:44, 1:8] NA NA NA NA NA NA ...
 $ ReturnMat_InSampleL22: logi [1:45, 1:8] NA NA NA NA NA NA ...
 $ ReturnMat_InSampleL23: logi [1:46, 1:8] NA NA NA NA NA NA ...
 $ ReturnMat_InSampleL24: logi [1:47, 1:8] NA NA NA NA NA NA ...
 $ ReturnMat_InSampleL25: logi [1:48, 1:8] NA NA NA NA NA NA ...

请注意,矩阵具有不同的行数,但所有 8 列均按要求提供。

该声明

names(lom) <- sprintf("ReturnMat_InSampleL%02i", seq_along(lom))

分别命名列表中的矩阵。


以下是处理矩阵列表时的一些技巧。

任何更改都会创建一个新对象。您必须确保正确存储结果。注意以下之间的区别:

lom <- lapply(24:48, function(i) matrix(i, ncol = FactorsNumber, nrow = i))
str(lom)
List of 25
 $ : int [1:24, 1:8] 24 24 24 24 24 24 24 24 24 24 ...
 $ : int [1:25, 1:8] 25 25 25 25 25 25 25 25 25 25 ...
 $ : int [1:26, 1:8] 26 26 26 26 26 26 26 26 26 26 ...
 $ : int [1:27, 1:8] 27 27 27 27 27 27 27 27 27 27 ...
...
lom[] <- lapply(24:48, function(i) matrix(i, ncol = FactorsNumber, nrow = i))
str(lom)
List of 25
 $ ReturnMat_InSampleL01: int [1:24, 1:8] 24 24 24 24 24 24 24 24 24 24 ...
 $ ReturnMat_InSampleL02: int [1:25, 1:8] 25 25 25 25 25 25 25 25 25 25 ...
 $ ReturnMat_InSampleL03: int [1:26, 1:8] 26 26 26 26 26 26 26 26 26 26 ...
 $ ReturnMat_InSampleL04: int [1:27, 1:8] 27 27 27 27 27 27 27 27 27 27 ...
...

分配给lom[]替换了单个元素的内容,从而保留了元素的名称,而不是创建一个全新的对象。

更新矩阵元素时,请确保返回一个完整的矩阵:

lom[] <- lapply(lom, function(m) {
  m[1, 1] <- m[1, 1] *10 
  return(m)
})
str(lom)
List of 25
 $ ReturnMat_InSampleL01: num [1:24, 1:8] 240 24 24 24 24 24 24 24 24 24 ...
 $ ReturnMat_InSampleL02: num [1:25, 1:8] 250 25 25 25 25 25 25 25 25 25 ...
 $ ReturnMat_InSampleL03: num [1:26, 1:8] 260 26 26 26 26 26 26 26 26 26 ...
 $ ReturnMat_InSampleL04: num [1:27, 1:8] 270 27 27 27 27 27 27 27 27 27 ...
...

更新特定矩阵的单元格:

lom$ReturnMat_InSampleL01[1, 1] <- lom$ReturnMat_InSampleL01[1, 1] + 2
str(lom)
List of 25
 $ ReturnMat_InSampleL01: num [1:24, 1:8] 242 24 24 24 24 24 24 24 24 24 ...
 $ ReturnMat_InSampleL02: num [1:25, 1:8] 250 25 25 25 25 25 25 25 25 25 ...
 $ ReturnMat_InSampleL03: num [1:26, 1:8] 260 26 26 26 26 26 26 26 26 26 ...
 $ ReturnMat_InSampleL04: num [1:27, 1:8] 270 27 27 27 27 27 27 27 27 27 ...
...

推荐阅读