【问题标题】:R - sum matrix rows and columns based on groupingsR - 基于分组对矩阵行和列求和
【发布时间】:2017-06-01 07:12:10
【问题描述】:

我有一个对称矩阵和一个适用于行和列的特定分组。我正在尝试根据此特定分组仅对那些行和列求和。

例如,我有一个 4 x 4 矩阵。我还有一个特定的分组,例如 1,1,2,2。也就是说,第 1 行和第 2 列属于第 1 组,而第 3 和第 4 行和第 4 列属于第 2 组。我想将函数 rowSums 或 rowsum 应用于组约束:

我的矩阵:

        [,1] [,2] [,3] [,4]
[1,]      0    1    0    0
[2,]      1    0    1    0
[3,]      0    1    0    3
[4,]      3    0    0    0

直观地帮助解决我的问题,分组 1、1、2、2 基本上意味着以下内容:

        [,1] [,2] [,3] [,4]
[1,]      0    1   NA   NA
[2,]      1    0   NA   NA
[3,]     NA   NA    0    3
[4,]     NA   NA    0    0

将 rowSums 应用于原始矩阵将产生:

[1] 1 2 4 3

此外,应用允许传递组的rowsum,仅将分组应用于行,并且仍然对不属于组的列求和:

      [,1] [,2] [,3] [,4]
1       1    1    1    0
2       3    1    0    3

这是一个问题的原因是因为我试图找到每个组中的最小值。由于以上包含不属于组的列,因此结果将不正确。我可以繁琐地遍历分组并应用 rowSums 来获得每组的总和,然后找到最小值:

rowSums(mat[c(1,2),c(1,2)])
[1] 1 1 <- minimum is 1
rowSums(mat[c(3,4),c(3,4)])
[1] 3 0 <- minimum is 0

但是,我的矩阵很大,这种方法不实用。我很确定有一种更有效、更简单的方法可以做到这一点,但我似乎找不到。理想情况下,我希望输出类似于:

1 1 2 2 <- grouping
1 1 3 0

甚至

      [,1] [,2] [,3] [,4]
1       1    1   Inf  Inf
2      Inf Inf    3    0

任何建议将不胜感激。

谢谢。

编辑:

我正在将我的问题调整为以下内容。鉴于我的原始矩阵:

        [,1] [,2] [,3] [,4]
[1,]      0    1    0    0
[2,]      1    0    1    0
[3,]      0    1    0    3
[4,]      3    0    0    0

以及特定的分组:

groups<-c(1,1,2,2)

我可以通过遍历组来实现所需的输出:

groups<-c(1,1,2,2)
for(i in 1:length(groups))
{
  mat[i,which(groups[i]!=groups)]<-NA
}

mat

     [,1] [,2] [,3] [,4]
[1,]    0    1   NA   NA
[2,]    1    0   NA   NA
[3,]   NA   NA    0    3
[4,]   NA   NA    0    0

如何在不使用低效循环的情况下实现这一点?

【问题讨论】:

  • 如果您取最小值,您是如何获得1 1 3 0 中的3
  • 我相信他想要 mat[1:2,1:2] 和 mat[3:4,3:4] 的最大行数。分组 c(1,1,2,2) 适用于行和列。
  • 在该步骤中,我只想显示每组的行总和(在搜索每组的最小值之前)。
  • 根据输出不是很清楚。正如你提到的rowSums,我在下面发布了一个解决方案
  • @akrun 你可以认为是:[1,] 1 [2,] 1 [3,] 3 [4,] 0

标签: r matrix sum row grouping


【解决方案1】:

也许这有帮助

sapply(split(mat, kronecker(matrix(1:4, nrow=2, byrow=TRUE), 
       matrix(1, 2, 2))), function(x) rowSums(matrix(x, ncol=2)))
#     1 2 3 4
#[1,] 1 0 1 3
#[2,] 1 1 3 0
解释
kronecker(matrix(1:4, nrow=2, byrow=TRUE), matrix(1, 2, 2))
#     [,1] [,2] [,3] [,4]
#[1,]    1    1    2    2
#[2,]    1    1    2    2
#[3,]    3    3    4    4
#[4,]    3    3    4    4

两个数组的kroneckerproduct 返回如上所示的分组索引。用它来split 矩阵

split(mat, kronecker(matrix(1:4, nrow=2, byrow=TRUE), 
   matrix(1, 2, 2)))
#$`1`
#[1] 0 1 1 0

#$`2`
#[1] 0 1 0 0

#$`3`
#[1] 0 3 1 0

#$`4`
#[1] 0 0 3 0

它返回 listvectors

vector 转换为matrix 并通过使用sapply 循环遍历list 来获得rowSums

【讨论】:

  • 谢谢。你的回答让我开始考虑在我的矩阵上使用 sapply 。我在上面编辑了我的问题以重定向所需的输出。请看一下。谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-06-20
  • 2020-08-26
  • 1970-01-01
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
相关资源
最近更新 更多