如何使用来自另一个矩阵的相应行的参数将函数应用于矩阵的每一行

时间:2014-05-07 18:44:17

标签: r

例如,有两个矩阵:

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

非常感谢。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以使用循环迭代矩阵的行:

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

答案 2 :(得分:0)

你也可以使用Map函数(在{1}}中类似于mapply而不进行简化)

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

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