get()
позволяет ссылаться на объект по строке. Это только даст вам так далеко; вам все равно нужно будет создать повторный вызов get () для матриц списка и т. д. Однако мне интересно, возможен ли альтернативный подход? Вместо того, чтобы хранить матрицы отдельно в рабочей области, почему бы не сохранить матрицы в списке?
Затем вы можете использовать sapply()
в списке, чтобы извлечь первый столбец каждой матрицы в списке. Шаг sapply()
возвращает матрицу, которую мы умножаем на вектор коэффициентов. Суммы столбцов этой матрицы - это значения, которые вы хотите получить из приведенного выше описания. По крайней мере, я предполагаю, что coef[1]*GON1EU[,1]
- это вектор length(GON1EU[,1])
и т. Д.
Вот код, реализующий эту идею.
vec <- 1:4 ## don't use coef - there is a function with that name
mat <- matrix(1:12, ncol = 3)
myList <- list(mat1 = mat, mat2 = mat, mat3 = mat, mat4 = mat)
colSums(sapply(myList, function(x) x[, 1]) * vec)
Вот какой-то вывод:
> sapply(myList, function(x) x[, 1]) * vec
mat1 mat2 mat3 mat4
[1,] 1 1 1 1
[2,] 4 4 4 4
[3,] 9 9 9 9
[4,] 16 16 16 16
> colSums(sapply(myList, function(x) x[, 1]) * vec)
mat1 mat2 mat3 mat4
30 30 30 30
Приведенный выше пример предлагает вам создать или прочитать ваши 100 матриц как компоненты списка с самого начала вашего анализа. Это потребует от вас изменения кода, который вы использовали для генерации 100 матриц. Поскольку у вас уже есть 100 матриц в вашем рабочем пространстве, чтобы получить myList
из этих матриц, мы можем использовать вектор имен, которые у вас уже есть, и использовать цикл:
Mat <- c("mat","mat","mat","mat")
## loop
for(i in seq_along(myList2)) {
myList[[i]] <- get(Mat[i])
}
## or as lapply call - Kudos to Ritchie Cotton for pointing that one out!
## myList <- lapply(Mat, get)
myList <- setNames(myList, paste(Mat, 1:4, sep = ""))
## You only need:
myList <- setNames(myList, Mat)
## as you have the proper names of the matrices
Я неоднократно использовал "mat"
в Mat
, так как это название моей матрицы выше. Вы бы использовали свой Mat
. Если vec
содержит то, что у вас есть в coef
, и вы создаете myList
, используя цикл for
, описанный выше, то все, что вам нужно сделать, это:
colSums(sapply(myList, function(x) x[, 1]) * vec)
Чтобы получить ответ, который вы хотели.