【问题标题】:R: Call matrixes from a vector of string names?R:从字符串名称向量调用矩阵?
【发布时间】:2011-05-02 07:56:28
【问题描述】:

假设我有 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])

我认为关键是如何从带有他的名字和使用以及矢量符号的字符串中调用一个对象。但我不知道怎么做。

【问题讨论】:

    标签: string r object matrix call


    【解决方案1】:

    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 中的内容,并且您使用上面的for 循环创建myList,那么您需要做的就是:

    colSums(sapply(myList, function(x) x[, 1]) * vec)
    

    为了得到你想要的答案。

    【讨论】:

    • “myList
    • 我的意思是,你在每个等号的右边写了同样的东西
    • 是的 - 这是虚拟数据。我不想创建四个不同的矩阵。你已经有了不同的矩阵。如果您不确定如何将矩阵放入列表中,请告诉我,我也会编辑我的答案以显示这一点。
    • 你好。我可以只写 myList
    • 不,根据 Spacedman 的回答,您需要 myList &lt;- list(get("GON1EU"), get("GON2EU"), get("GON3EU"), get("NEW4",...))。如果您已经有 100 个单独的矩阵,则可以循环执行此操作。我在看您是否可以重新考虑如何存储数据。我将编辑我的答案,向您展示如何根据矩阵名称生成 myList
    【解决方案2】:

    查看帮助(获取)就是这样。

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

    > 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
    

    【讨论】:

    • 嗨。谢谢,不过不知道怎么用Get 似乎不接受名称向量。
    • @user425895; get() 不会,您需要围绕它包装一些东西以将其扩展到您的 coef[1]*GON1EU[,1]+coef[2]*GON2EU[,1]+coef[3]*GON3EU[,1]+coef[4]*NEW4[,1]+..... 位。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多