R - 基于分组的矩阵行和列

时间:2017-01-17 09:31:54

标签: r matrix sum row grouping

我有一个对称矩阵和一个适用于行和列的特定分组。我试图根据这个特定的分组只对那些行和列求和。

例如,我有一个4 x 4矩阵。我也有一个特定的分组,如1,1,2,2。也就是说,行和列1和2属于组1,而行和列3和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 个答案:

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

两个数组的kronecker乘积返回分组索引,如上所示。用它来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

返回list vector

vector转换为matrix并通过rowSums list循环sapply获取 $scope.homepageSearch = function(search) { homepagesearchService.getData(search).then(function(data) { $scope.result = data; DataService.set(data); // and move to another page using $state.go('whatever page you want') console.log(data); }); } //in that page load data from service var data = DataService.get()// and here you can use that data //in service //make a var holdingdata; like set(data){ holdingdata = data; } get(){ return holdingdata; }