【问题标题】:How to apply a function to each row of a matrix with arguments from the corresponding row of another matrix如何使用来自另一个矩阵的相应行的参数将函数应用于矩阵的每一行
【发布时间】:2014-05-07 18:44:16
【问题描述】:

例如有两个矩阵:

A <- matrix(1:10,nrow=2)
B <- matrix(1:4,nrow=2)
A
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10

B
     [,1] [,2]
[1,]    1    3
[2,]    2    4

如果我想提取A的每一行的一些元素,而B的对应行提供A的元素的索引范围,有没有简单的方法可以做到这一点?在上面的例子中,A的第一行是c(1,3,5,7,9),我想得到第1到第3个元素(如B的第一行所示,c(1,3)) ,即 c(1,3,5)。对于 A 的第二行,我想得到第 2 到第 4 个元素,即 c(4,6,8)。所以我期望的结果是:

[[1]]
[1] 1 3 5

[[2]]
[1] 4 6 8

非常感谢。

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以通过在行索引上操作 lapply 来做到这一点:

    lapply(seq(nrow(B)), function(idx) A[idx,B[idx,1]:B[idx,2]])
    # [[1]]
    # [1] 1 3 5
    # 
    # [[2]]
    # [1] 4 6 8
    

    【讨论】:

    • 这是 'lapply' 函数的一个有趣用法。非常感谢。
    • 只是为了好玩,您可以使用这种奇特的方法lapply(seq(ncol(B)), function(i) A[i, Reduce(seq, B[i,])])
    • 如果我需要处理高维矩阵,我该怎么做?比如dim(A)是c(2,3,5),dim(B)是c(2,3,2),计算是在第三维上,那我怎么用lapply这个方法呢?跨度>
    • @ZNN 您需要修改它以遍历二维中所有可能的索引,而不仅仅是seq(nrow(B));遍历expand.grid(seq(dim(B)[1]), seq(dim(B)[2])) 的行可能会成功。
    【解决方案2】:

    您可以使用循环来遍历矩阵的行:

    res <- list()
    for (i in 1:nrow(A)) {
        res[[i]] <- A[i, B[i,1]:B[i,2]]
    }
    

    【讨论】:

    • 谢谢。我限制自己使用“应用”功能来解决问题。您的解决方案简单直接。
    【解决方案3】:

    您也可以使用Map函数(在这种情况下与mapply类似,无需简化)

    Map(function(i,a,b) A[i, a:b], seq.int(ncol(B)), B[,1], B[,2])
    

    这可能更容易扩展到更多维度。

    【讨论】:

      猜你喜欢
      • 2019-11-15
      • 1970-01-01
      • 2013-02-23
      • 1970-01-01
      • 2020-02-24
      • 1970-01-01
      • 2011-05-13
      • 2011-01-19
      相关资源
      最近更新 更多