假设我有一个整数的矩阵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
答案 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