【发布时间】: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