Добавление столбцов матрицы на основе значений другого вектора
Предположим, что у меня есть следующая Матрица:
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 ответа:
Один из способов состоит в том, чтобы скопировать последовательность "подсчетов" вектором "подсчетов", использовать его для
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