作为一个简单的例子,我有一个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=3
,3+4=7
和5=5
相加以创建新矩阵的第一行{{1 }}。我们对其他两个元素进行类似的处理,对应于新矩阵的第2行和第3行。
mat2
我怎样才能有效地创造这个?我可能有一个> mat2
[,1] [,2] [,3]
[1,] 3 7 5
[2,] 3 3 9
[3,] 3 3 5
,它有很多行和多列。
答案 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))