R 在循环中填充多个矩阵,使用矩阵名称为循环的每次迭代选择不同的矩阵?

R 在循环中填充多个矩阵,使用矩阵名称为循环的每次迭代选择不同的矩阵?,r,loops,for-loop,matrix,R,Loops,For Loop,Matrix,我认为这个问题的答案很简单,但老实说,我找不到解决办法。我使用assign()和paste()函数创建25个带有循环的空矩阵,更改名称中的数字。 因此,矩阵的名称为: ReturnMat\u样本24,…,ReturnMat\u样本48 我知道我可以使用get()以循环方式打印出这些矩阵 关键是我需要找到一种方法,用一个循环来修改这些矩阵(然后它将被放置在其他循环中,但现在应该无关紧要) 因此,我希望实现以下目标: for (i in 1:25) {ReturnMat_InSampleLi[] =

我认为这个问题的答案很简单,但老实说,我找不到解决办法。我使用
assign()
paste()
函数创建25个带有循环的空矩阵,更改名称中的数字。 因此,矩阵的名称为:
ReturnMat\u样本24
,…,
ReturnMat\u样本48

我知道我可以使用
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)) }

我无法破译您的代码,但管理相关对象集合的最佳方法是使用列表。然后使用列表索引对列表中的每个元素进行操作,而不是在环境中创建独立的对象。以下是创建5个矩阵列表的简单示例,每个矩阵的维度为4x4,由16个介于1和100之间的随机值填充:

my_list <- list()
for (i in 1:5) {
      values <- sample(1:100, 16)
      my_list[[i]] <- matrix(values, nrow = 4, ncol = 4)

}

我的清单我不确定我是否完全理解OP的内涵,但这就是我要做的

与在全局环境中创建25个矩阵不同,我将所有矩阵存储在一个列表中(
lom
aka矩阵列表),在该列表中,它们可以单独处理,也可以通过
lappy()
作为一个整体处理:

请注意,矩阵的行数不同,但所有8列都按要求排列

声明

names(lom) <- sprintf("ReturnMat_InSampleL%02i", seq_along(lom))
分配给
lom[]
替换了单个元素的内容,从而保留了元素的名称,而不是创建一个全新的对象

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

lom[] <- lapply(lom, function(m) {
  m[1, 1] <- m[1, 1] *10 
  return(m)
})
str(lom)
更新特定矩阵的单元格:

lom$ReturnMat_InSampleL01[1, 1] <- lom$ReturnMat_InSampleL01[1, 1] + 2
str(lom)

欢迎来到SO!我试图通过将
x
替换为
*
来清理您的代码,因为后者是R中正确的乘法运算符。但是,由于
periodsumber1
未定义,代码仍然无法工作。请回答您的问题并更正您的代码,这样它将是一个完整的代码。帮助我们帮助你。谢谢。嗨,乌维,我为这个错误感到抱歉。我添加了缺少的变量,现在应该可以工作了。谢谢史蒂文,非常感谢你的帮助。这很有道理。下面是用于创建矩阵集的编辑代码:
ReturnMat_InSampleL=list()(i in 1:(nrow(InSamplePeriodLengthTest)){ReturnMat_InSampleL[[i]]]=matrix(c(rep(NA,(1+InSamplePeriodLengthTest[i])*系数*((periodsUnber1-1-InSamplePeriodLengthTest[i])-(InSamplePeriodLengthTest[i]*2)+1))),ncol=FactorsNumber)}
Stefano,很乐意为您提供帮助。如果你也能投票支持我的贡献,我将不胜感激。史蒂文,当然这是我第一件要做的事。不幸的是,我得到了这样一句话:“谢谢你的反馈!那些声誉低于15的人所投的票会被记录下来,但不会改变公开显示的帖子分数。”非常感谢你,我们,我会选择你的解决方案或史蒂文的解决方案。但我认为这个想法基本相同,有两种不同的实现方式。@StefanoSerio。是的,两种方法都使用列表
lappy()
是一个隐含的
for
循环,它返回一个列表作为结果。
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[] <- 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 ...
...