r - 在循环中填充多个矩阵,使用矩阵的名称为循环的每次迭代选择不同的矩阵?
问题描述
我认为这个问题的答案很容易,但老实说我找不到解决方案。我使用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)) }
解决方案
我不确定我是否完全理解了 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 ... ...
推荐阅读
- node.js - img src 属性将我的请求发送到不同的路由
- javascript - 未通过 Redux 处理的 Promise
- c# - C# 完成后重复一个 mp3 文件
- php - 使用phpmailer发送表单时没有页面刷新
- c - ESP32 如何重置与 PCNT 一起使用的 GPIO 引脚,以便它们也可用于 EXT1 从深度睡眠中唤醒?
- codenameone - Codename One 应用程序的线程计数
- python-3.x - 两个看起来应该做同样事情但输出不同结果的python循环?
- php - 为 Angular 应用程序配置 php 后端和 mysql 数据库
- java - Spring MockMVC redirectUrlPattern 抛出“No Ant-style path pattern”
- dart - Dart 2.0 中是否有任何密封类替代方案?