【问题标题】:Efficient way to sum specific row groupings in R在 R 中求和特定行分组的有效方法
【发布时间】:2017-06-08 04:08:51
【问题描述】:

举个简单的例子,我有一个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 求和,以创建新矩阵mat2 的第一行。我们对其他两个元素进行类似处理,对应于新矩阵的第 2 行和第 3 行。

> mat2
     [,1] [,2] [,3]
[1,]    3    7    5
[2,]    3    3    9
[3,]    3    3    5

我怎样才能有效地创建它?可能,我有一个mat,它有很多行和很多列。

【问题讨论】:

  • 我认为最后一个值是 5。你还没有更改输入数据集的值 map.list

标签: r matrix


【解决方案1】:

我们可以的

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))

【讨论】:

    猜你喜欢
    • 2020-04-08
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 2012-05-10
    相关资源
    最近更新 更多