R: как применить функцию суммы в списке? - PullRequest
2 голосов
/ 16 марта 2020

У меня проблема с суммированием строк моих матриц. У меня есть список из 30 матриц

Matrix<-matrix(1:45, ncol=9)
List<-list(lapply(seq_len(30), function(X) Matrix))

Идея состоит в том, чтобы создать 30 матриц размером 5 * 3. Во-первых, мне нужно сложить несколько столбцов, 1:3 4:6 7:9, чтобы результат был следующим:

     [,1] [,2] [,3] 
[1,]    18    63   108   
[2,]    21    66   111   
[3,]    34    69   114   
[4,]    47    72   117   
[5,]    30    75   120   

Я пытаюсь получить эту матрицу, используя этот код:

Y<-lapply(List, function(x) rowSums(x[, 1:3]))

Но это позволяет мне суммировать только 3 первых столбца.

После этого мне нужно суммировать список и получить только одну матрицу (5 * 3). Я думаю, что команда final<-reduce(Y, + ) может помочь.

540 1890 3240
630 1980 3330
1020 2070 3420
1410 2160 3510
900 2250 3600

Спасибо за вашу помощь

Ответы [ 2 ]

1 голос
/ 17 марта 2020

Вот еще одно базовое решение R

out <- Reduce(`+`,Map(function(x) do.call(cbind,Map(rowSums, split.default(data.frame(x),ceiling(seq(ncol(x))/3)))),List[[1]]))

такое, что

> out
       0    1    2
[1,] 540 1890 3240
[2,] 630 1980 3330
[3,] 720 2070 3420
[4,] 810 2160 3510
[5,] 900 2250 3600
1 голос
/ 17 марта 2020

Вам нужно найти способ сгруппировать столбцы по трем, например:

grp = (1:ncol(Matrix) -1) %/% 3

или если вы знаете размеры:

grp  = rep(0:2,each=3)

Выполнение сумм строк в столбцах по три мы можем сделать это с помощью функции:

SumCols = function(M,col_grp){
sapply(unique(col_grp),function(i)rowSums(M[,col_grp==i]))
}
SumCols(Matrix,grp)

     [,1] [,2] [,3]
[1,]   18   63  108
[2,]   21   66  111
[3,]   24   69  114
[4,]   27   72  117
[5,]   30   75  120

Так что поместите это в свой список матриц,

Reduce("+",lapply(List[[1]],SumCols,grp))

     [,1] [,2] [,3]
[1,]  540 1890 3240
[2,]  630 1980 3330
[3,]  720 2070 3420
[4,]  810 2160 3510
[5,]  900 2250 3600
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...