R:从字符串名称向量中调用矩阵?

时间:2010-10-29 09:43:44

标签: string r object matrix call

想象一下,我有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 个答案:

答案 0 :(得分:6)

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)

获得你想要的答案。

答案 1 :(得分:2)

请参阅help(get),就是这样。

如果你给我们一个可重复的例子,我会说更多。例如:

> 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

在循环中放置你需要的任何东西,或者在向量M上使用apply并得到对象:

> sum(unlist(lapply(M,function(n){get(n)^2})))
[1] 30