对矩阵的分组列执行操作

时间:2017-01-17 21:53:59

标签: r matrix

假设我有一个整数的矩阵cout <<和向量M,这样G的条目数与G中的列数一样多。例如(示意性地):

M

向量G: 1 1 1 2 2 3 3 3 3 M: 4 20 12 4 71 46 45 25 64 50 54 88 1 80 8 86 71 26 28 7 31 44 84 46 35 32 0 45 15 46 76 39 67 10 59 59 G列的分组进行编码。在上面的示例中,M对三组列进行编码,对应于下面显示的三个子矩阵:

G

(注意:为了清楚起见,在这个例子中,我选择了由连续列组成的组,但一般来说,组中的列不需要是连续的。在这种情况下,组的顺序应该是 4 20 12 50 54 88 28 7 31 45 15 46 4 71 1 80 44 84 76 39 46 45 25 64 8 86 71 26 46 35 32 0 67 10 59 59 中首次出现的顺序。)

我想进行一次&#34;崩溃&#34; (或&#34;汇总&#34;)对每个子矩阵的每一行进行操作,并将结果列连接成一个新矩阵。例如,如果折叠操作为G,则刚刚描述的过程将生成箭头右侧下方显示的三列:

max

因此,最终结果将是矩阵:

  4   20   12           20 
 50   54   88        -> 88 
 28    7   31           31 
 45   15   46           46 

  4   71                71
  1   80             -> 80 
 44   84                84
 76   39                76


 46   45   25   64      64 
  8   86   71   26   -> 86 
 46   35   32    0      46 
 67   10   59   59      67 

如何在R中进行这种操作?

(FWIW,下面是创建上面显示的 20 71 64 88 80 86 31 84 46 46 76 67 M的代码。)

G

3 个答案:

答案 0 :(得分:4)

这是一种可能性:

## I know your matrix has 4 rows, that is what the `4` in the following means
lst <- split(M, rep(G, each = 4L))
sapply(lst, function (x) sapply(split(x, 1:4), max) )

#   1  2  3
#1 20 71 64
#2 88 80 86
#3 31 84 46
#4 46 76 67

函数function (x) sapply(split(x, 1:4), max)实际上是行最大值。

答案 1 :(得分:3)

以下是rowMaxs

的另一个选项
library(matrixStats)
sapply(split.default(as.data.frame(M), G), function(x) rowMaxs(as.matrix(x)))
#     1  2  3
#[1,] 20 71 64
#[2,] 88 80 86
#[3,] 31 84 46
#[4,] 46 76 67

或以上的变体是

sapply(split(t(M), G), function(x) rowMaxs(matrix(x, nrow=4, byrow=TRUE)))

答案 2 :(得分:2)

另一种可能性,依赖于矩阵通常由列顺序填充的事实:

simplify2array(by(t(M), G, function(x) sapply(x,max) ))
#    1  2  3
#V1 20 71 64
#V2 88 80 86
#V3 31 84 46
#V4 46 76 67