#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, ваш код великолепен, я не думаю, что он «очень простой».