在R

时间:2017-06-08 04:08:52

标签: r matrix

作为一个简单的例子,我有一个3x5矩阵

mat <- matrix(rep(seq(5),3),nrow=3,byrow = T)

我希望根据map.list定义的特定分组对每行中的元素求和,该分组与nrow(mat)具有相同数量的主要元素。它可能看起来像这样:

map.list <- list(list(c(1,2),c(3,4),5),
             list(c(1,2),3,c(4,5)),
             list(c(1,2),4,5))

> map.list
[[1]]
[[1]][[1]]
[1] 1 2

[[1]][[2]]
[1] 3 4

[[1]][[3]]
[1] 5


[[2]]
[[2]][[1]]
[1] 1 2

[[2]][[2]]
[1] 3

[[2]][[3]]
[1] 4 5


[[3]]
[[3]][[1]]
[1] 1 2

[[3]][[2]]
[1] 3

[[3]][[3]]
[1] 5

这意味着对于mat的第一行,我们会将1+2=33+4=75=5相加以创建新矩阵的第一行{{1 }}。我们对其他两个元素进行类似的处理,对应于新矩阵的第2行和第3行。

mat2

我怎样才能有效地创造这个?我可能有一个> mat2 [,1] [,2] [,3] [1,] 3 7 5 [2,] 3 3 9 [3,] 3 3 5 ,它有很多行和多列。

1 个答案:

答案 0 :(得分:0)

我们可以做到

t(sapply(seq_len(nrow(mat)), function(i) sapply(map.list[[i]],function(j) sum(mat[i, j]))))
#     [,1] [,2] [,3]
#[1,]    3    7    5
#[2,]    3    3    9
#[3,]    3    3    5

或另一种选择是

library(reshape2)
dM <- melt(map.list)[, 3:1]
m1 <- sapply(split(mat[as.matrix(dM[-2])],
       interaction(dM[1:2], drop = TRUE, lex.order = TRUE)), sum)
matrix(m1, 3, 3, byrow=TRUE)
#     [,1] [,2] [,3]
#[1,]    3    7    5
#[2,]    3    3    9
#[3,]    3    3    5

数据

map.list <- list(list(c(1,2),c(3,4),5),
         list(c(1,2),3,c(4,5)),
         list(c(1,2),3,5))