Как добавить в список матриц в R?

avatar
Chunky Monkey
8 апреля 2018 в 04:12
597
1
0

Учитывая набор данных 'train', содержащий 1607 строк и 256 столбцов, я хочу сделать каждую строку (с элементами 256 в каждой) матрицей 16x16 и иметь список для хранения 16x165891 из>59291 такие матрицы. Все наблюдения в данных train представляют собой значения между -1 и 1. Например, вектор-строка в train может быть

a <- seq(from = -1, to = 1, length = 256)

Когда я пытаюсь запустить такой цикл,

x <- lapply(1:nrow(train), matrix, data=0, nrow=16, ncol=16) #creates list of 1607 matrices of 0's
for (i in length(x)) {
   x[[i]] <- matrix(X_train[i,], nrow=16, ncol=16) #replace each element (matrix) of list x with a matrix of the same dimension from train
}

Я продолжаю получать один и тот же немодифицированный список x с матрицами 0 для всех элементов x. Что я делаю не так?

Источник
r2evans
8 апреля 2018 в 04:19
1

Пожалуйста, сделайте этот вопрос воспроизводимым, включив примеры данных либо из вашего trainX_train), либо из чего-то по умолчанию (например, mtcars или iris).

Ответы (1)

avatar
Hong Ooi
8 апреля 2018 в 04:26
0
for (i in length(x)) {

Здесь вы перебираете одно значение, а именно length(x). Вероятно, вы захотите перебрать все значения от 1 до длины x. Вы делаете это с помощью

for (i in 1:length(x)) {

или

for (i in seq_along(x)) {

Преимущество последнего состоит в том, что он не даст плохого результата, если x пусто. Но на самом деле вам вообще не нужно делать цикл или создавать список пустых матриц, которые вы сразу же отбрасываете. Вместо этого выполните:

rows <- seq_len(nrow(X_train))
x <- lapply(rows, function(row) matrix(X_train[row, ], nrow=16, ncol=16))
Chunky Monkey
8 апреля 2018 в 04:40
0

Вау, это было глупо с моей стороны. Спасибо!