2017-01-17 104 views
0

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

例如,我有一个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 

我怎样才能做到这一点,而不使用低效循环?

+0

循环在list得到rowSums你是怎么得到的'3 '在'1 1 3 0'中,如果你取最小值 – akrun

+0

我相信他想要mat [1:2,1:2]和mat [3:4,3:4]的最大值。分组c(1,1,2,2)适用于行和列。 – Haboryme

+0

在这一步中,我只想显示每个组的行数(在搜索每个组的最小值之前)。 – hsn

回答

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 

它返回的vector小号

一个list转换的vectormatrix并通过与sapply

+0

谢谢。你的回答让我想到了在我的矩阵上使用sapply。我已经编辑了上面的问题来重定向所需的输出。请看一下。谢谢! – hsn