Р: Вызовите матрицы из вектора строковых имен? - PullRequest
0 голосов
/ 29 октября 2010

Представьте, что у меня есть 100 числовых матриц с 5 столбцами в каждой.Я храню имена этих матриц в векторе или списке:

Mat <- c("GON1EU", "GON2EU", "GON3EU", "NEW4", ....)

У меня также есть вектор коэффициентов "coef",

coef <- c(1, 2, 2, 1, ...)

И я хочу вычислить результирующий вектортаким образом:

coef[1]*GON1EU[,1]+coef[2]*GON2EU[,1]+coef[3]*GON3EU[,1]+coef[4]*NEW4[,1]+.....

Как я могу сделать это компактно, используя вектор имен?

Что-то вроде:

coef*(Object(Mat)[,1])

Я думаюключ в том, как вызвать объект из строки с его именем, использованием и векторной нотацией.Но я не знаю как.

Ответы [ 2 ]

6 голосов
/ 29 октября 2010

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)

Чтобы получить ответ, который вы хотели.

2 голосов
/ 29 октября 2010

См. Помощь (получить) и все.

Если бы вы дали нам воспроизводимый пример, я бы сказал немного больше. Например:

> a=1;b=2;c=3;d=4
> M=letters[1:4]
> M
[1] "a" "b" "c" "d"
> sum = 0 ; for(i in 1:4){sum = sum + i * get(M[i])}
> sum
[1] 30

Поместите в цикл все, что вам нужно, или примените apply к вектору M и получите объект:

> sum(unlist(lapply(M,function(n){get(n)^2})))
[1] 30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...