Заполнение нескольких матриц в al oop, используя имя матриц для выбора другой матрицы для каждой итерации l oop? - PullRequest
0 голосов
/ 26 января 2020

Я думаю, что ответ на этот вопрос будет очень простым, но, честно говоря, я не смог найти решение. Я использовал функции assign() и paste(), чтобы создать 25 пустых матриц с L OOP, меняя число в имени. Таким образом, имена матриц: ReturnMat_InSampleL24, ..., ReturnMat_InSampleL48

Я знаю, что могу использовать get(), чтобы также распечатать эти матрицы с помощью al oop.

Суть в том, что мне нужно найти способ изменить эти матрицы с помощью одного l oop (он будет размещен внутри других, но это не должно иметь значения прямо сейчас)

Так что я хотел бы достичь чего-то вроде:

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

Но, конечно, это не работает, мы не можем поставить i в имени внутри l oop.

Здесь это код для матриц, на всякий случай:

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)) }

Ответы [ 2 ]

1 голос
/ 26 января 2020

Я не уверен, полностью ли я понял намерение ОП, но это то, что я хотел бы сделать.

Вместо создания 25 матриц в глобальной среде я бы сохранял все матрицы в списке (lom aka список матриц ), где они могут обрабатываться как индивидуально, так и в целом с помощью 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 ...
...
0 голосов
/ 26 января 2020

Я не могу расшифровать ваш код, но лучший способ управлять коллекцией связанных объектов - это список. Затем используйте индекс списка для работы с каждым элементом в списке, вместо создания независимых объектов в среде. Вот простой пример создания списка из 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)

}

Вы можете назначать имена каждому члену списка или просто работать с ним. каждый член, ссылаясь на его значение индекса списка. Вы также можете работать с каждым матричным элементом списка с помощью одной из функций семейства apply, например:

my_list_t <- lapply(my_list, function(x) t(x))

Создаст второй список матриц с транспонированием матриц в исходном списке.

...