Переход от вектора к матрице в R - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть список чисел от 1 до 105. Я хочу перейти к нижней матрице треугольника с диагональными значениями.Однако я не хочу, чтобы эта матрица заполнялась строкой, вместо этого я хочу следующий шаблон:

enter image description here

Число в этой матрице относится к элементамиз списка (х), который я хотел бы видеть в матрице.Так, например, число 64 из моего списка должно быть в левом нижнем углу матрицы.

Существующие функции (например, lower.tri или matrix(x, byrow=TRUE), похоже, не работают здесь, поэтому я немного растерялся, как к этому подойти.

x <- c(1:105)

РЕДАКТИРОВАТЬ:

Обратите внимание, что матрица на изображении имеет "причуды". Это лучше всего проиллюстрировать, посмотрев на столбец 6 и столбец 7. Значения в 7-й строке идут от 27 до 70, в 8-й строке от 33 до 71 и т. Д.далее, то же самое происходит между столбцом 12 и 13, где значения в строке 13 изменяются с 96 на 103 и на 102 - 104 в строке 14.

EDIT2:

из комментария:Единственное реальное правило, о котором я могу думать, это то, что после каждых 6 столбцов будет происходить «странность»: с матрицей 13x13 вместо 70 это будет 64, с 12x12 это будет 58, и так далее, так что оно уменьшается на 6. СМатрица 14x14, очевидно, что это 14 столбцов, поэтому разрыв столбца будет происходить дважды, после 6-го столбца и после 12-го столбца. С матрицей 19x19 мы получим разрыв столбца три раза - после 6-го, 12-го и 18-го.Я поднимаю это, потому чтоSE необычные значения будут начинаться после каждого разрыва столбца

1 Ответ

0 голосов
/ 08 февраля 2019

Редактировать: Automated Way

Вот функция, которая должна позаботиться о том, что вы просите ...

code_matrix <- function(p, change_col = 6) {
  # we will create the transpose of the desired matrix first
  # this handles the row wise assignment

  # initialize your matrix
  m <- matrix(0, p, p)

  # create a logical upper triangular to track where we will put values
  a <- matrix(T, p, p)
  a[lower.tri(a)] <- F

  # tracks what the last number from the prior block was
  end_num <- 0

  # how many blocks of columns to divide things into based on the rule
  m_blocks <- 1:ceiling(p / change_col)

  # loop through each of the blocks
  for (i in m_blocks) {

    # calculate the start and end rows in the block
    start_row <- (i - 1) * change_col + 1
    end_row <- min(start_row + (change_col - 1), p)

    # create the sequence of numbers
    v <- end_num + 1:sum(a[start_row:end_row,])

    # store the sequence back into the matrix by using the logical matrix
    m[start_row:end_row,][a[start_row:end_row,]] <- v

    # increase the tracker  
    end_num <- max(v)
  }

  return(t(m))
}

Предоставление теста...

> code_matrix(14)

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
 [1,]    1    0    0    0    0    0    0    0    0     0     0     0     0     0
 [2,]    2    3    0    0    0    0    0    0    0     0     0     0     0     0
 [3,]    4    5    6    0    0    0    0    0    0     0     0     0     0     0
 [4,]    7    8    9   10    0    0    0    0    0     0     0     0     0     0
 [5,]   11   12   13   14   15    0    0    0    0     0     0     0     0     0
 [6,]   16   17   18   19   20   21    0    0    0     0     0     0     0     0
 [7,]   22   23   24   25   26   27   70    0    0     0     0     0     0     0
 [8,]   28   29   30   31   32   33   71   72    0     0     0     0     0     0
 [9,]   34   35   36   37   38   39   73   74   75     0     0     0     0     0
[10,]   40   41   42   43   44   45   76   77   78    79     0     0     0     0
[11,]   46   47   48   49   50   51   80   81   82    83    84     0     0     0
[12,]   52   53   54   55   56   57   85   86   87    88    89    90     0     0
[13,]   58   59   60   61   62   63   91   92   93    94    95    96   103     0
[14,]   64   65   66   67   68   69   97   98   99   100   101   102   104   105
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...