Добавление нескольких матриц и вектора в одну матрицу в R

#r #matrix #append

Вопрос:

У меня есть функция, которая может создать матрицу с учетом значений k и n. Где каждая комбинация строк складывается до k, а n-это количество столбцов. Пример: если k=3 и n=20, то

 library(partitions) posloclt;- function(k, n){  df = t(as.matrix(blockparts(rep(k,n),k, include.fewer = FALSE)))  indx lt;- !duplicated(t(apply(df, 1, sort)))  (df[indx, ]) }  posloc(4,5)   [,1] [,2] [,3] [,4] [,5] [1,] 4 0 0 0 0 [2,] 3 1 0 0 0 [3,] 2 2 0 0 0 [4,] 2 1 1 0 0 [5,] 1 1 1 1 0  

Мне нужно добавить все матрицы до k:0 в одну матрицу. Например, я хочу, чтобы моя итоговая матрица выглядела так

 [,1] [,2] [,3] [,4] [,5] [1,] 4 0 0 0 0 [2,] 3 1 0 0 0 [3,] 2 2 0 0 0 [4,] 2 1 1 0 0 [5,] 1 1 1 1 0 [6,] 3 0 0 0 0 [7,] 2 1 0 0 0 [8,] 1 1 1 0 0 [9,] 2 0 0 0 0 [10,] 1 1 0 0 0 [11,] 1 0 0 0 0 [12,] 0 0 0 0 0  

Я пробовал следовать ему, но всегда получаю матрицу, содержащую только последнюю строку

 for(i in k:0){  assign(paste0("pc_", i), posloc(i,n)) }  for(i in k:0){  temp lt;- rbind(get(eval(paste0("pc_", i, sep="")))) }   [,1] [,2] [,3] [,4] [,5] [1,] 0 0 0 0 0   

Может кто-нибудь, пожалуйста, помочь мне понять, что я делаю не так, чтобы получить нужную мне матрицу? Спасибо.

Ответ №1:

С помощью sapply .

 do.call(rbind, sapply(4:0, function(k) posloc(k, 5))) # [,1] [,2] [,3] [,4] [,5] # [1,] 4 0 0 0 0 # [2,] 3 1 0 0 0 # [3,] 2 2 0 0 0 # [4,] 2 1 1 0 0 # [5,] 1 1 1 1 0 # [6,] 3 0 0 0 0 # [7,] 2 1 0 0 0 # [8,] 1 1 1 0 0 # [9,] 2 0 0 0 0 # [10,] 1 1 0 0 0 # [11,] 1 0 0 0 0 # [12,] 0 0 0 0 0  

Если вы хотите придерживаться for цикла, вам следует сначала инициализировать пустую матрицу.

 m lt;- matrix(nrow=0, ncol=5) for (i in 4:0) {  m lt;- rbind(m, posloc(i, 5)) } # [,1] [,2] [,3] [,4] [,5] # [1,] 4 0 0 0 0 # [2,] 3 1 0 0 0 # [3,] 2 2 0 0 0 # [4,] 2 1 1 0 0 # [5,] 1 1 1 1 0 # [6,] 3 0 0 0 0 # [7,] 2 1 0 0 0 # [8,] 1 1 1 0 0 # [9,] 2 0 0 0 0 # [10,] 1 1 0 0 0 # [11,] 1 0 0 0 0 # [12,] 0 0 0 0 0  

Комментарии:

1. Извините, если мой код был очень простым, я учусь на практике. Большое вам спасибо за то, что ответили на мой вопрос и указали мне правильное направление.

2. Добро пожаловать @SwamJay, ваш код великолепен, я не думаю, что он «очень простой».