Добавление столбцов матрицы на основе значений другого вектора


Предположим, что у меня есть следующая Матрица:

 mat <- matrix(1:20, ncol=5)
      [,1] [,2] [,3] [,4] [,5]
[1,]    1    5    9   13   17
[2,]    2    6   10   14   18
[3,]    3    7   11   15   19
[4,]    4    8   12   16   20

И следующий Вектор

counts=c(2,1,2)

Мне нужно свернуть эту матрицу, добавив столбцы, основанные на каждом значении этого вектора. Это означает, что первые два столбца должны быть добавлены, третий остается равным и суммирует последние два столбца. Моя результирующая матрица должна быть такой

      [,1] [,2] [,3] 
[1,]    6    9   30
[2,]    8   10   32
[3,]    10  11   34
[4,]    12  12   36

Как я мог бы сделать это автоматически, учитывая, что в моем случае у меня есть очень большая матрица и вектор отсчетов с разными ценности?

2 2

2 ответа:

Один из способов состоит в том, чтобы скопировать последовательность "подсчетов" вектором "подсчетов", использовать его для split последовательности столбцов "мата", чтобы вернуть list, петлю через list с sapply, использовать индекс столбца для subset "мата" для каждого элемента list и получить rowSums.

mat2 <- sapply(split(1:ncol(mat), rep(seq_along(counts), counts)), 
           function(i) rowSums(mat[,i,drop=FALSE]))
dimnames(mat2) <- NULL
mat2
#     [,1] [,2] [,3]
#[1,]    6    9   30
#[2,]    8   10   32
#[3,]   10   11   34
#[4,]   12   12   36

Еще одна идея, концептуально сходная с идеей акруна:

t(rowsum(t(mat), rep(seq_along(counts), counts)))
#      1  2  3
#[1,]  6  9 30
#[2,]  8 10 32
#[3,] 10 11 34
#[4,] 12 12 36