Список списков матриц

Я пытаюсь манипулировать списком списков R, которые сами содержат матрицы. То, что я хочу сделать, похоже на этот вопрос где список матриц l объединяется в одну матрицу с помощью функции do.call(rbind, l) или rbind.fill.matrix(l) из plyr. Однако я хочу объединить матрицы из разных элементов списка верхнего уровня, сохранив при этом группы на нижнем уровне, чтобы в итоге получить список матриц с отдельными элементами, соответствующими группам списков нижнего уровня.

В качестве примера рассмотрим топлист списка верхнего уровня, составленный из трех списков нижнего уровня:

lowerlist1 = list(matrix1_1, matrix1_2, matrix1_3, matrix1_4)
lowerlist2 = list(matrix2_1, matrix2_2, matrix2_3, matrix2_4)
lowerlist3 = list(matrix3_1, matrix3_2, matrix3_3, matrix3_4)
toplist = list(lowerlist1, lowerlist2, lowerlist3)

где все матрицы имеют одинаковое количество столбцов, но могут иметь разное количество строк. В итоге хотелось бы новый список newtoplist со следующей структурой

newmatrix1 = rbind(matrix1_1, matrix2_1, matrix3_1)
newmatrix2 = rbind(matrix1_2, matrix2_2, matrix3_2)
newmatrix3 = rbind(matrix1_3, matrix2_3, matrix3_3)
newmatrix4 = rbind(matrix1_4, matrix2_4, matrix3_4)
newtoplist = list(newmatrix1, newmatrix2, newmatrix3, newmatrix4)

Итак, полный пример:

matrix1_1 = matrix(1.1, 4, 5)
matrix1_2 = matrix(1.2, 3, 5)
matrix1_3 = matrix(1.3, 2, 5)
matrix1_4 = matrix(1.4, 3, 5)
matrix2_1 = matrix(2.1, 2, 5)
matrix2_2 = matrix(2.2, 4, 5)
matrix2_3 = matrix(2.3, 5, 5)
matrix2_4 = matrix(2.4, 2, 5)
matrix3_1 = matrix(3.1, 2, 5)
matrix3_2 = matrix(3.2, 4, 5)
matrix3_3 = matrix(3.3, 5, 5)
matrix3_4 = matrix(3.4, 2, 5)

lowerlist1 = list(matrix1_1, matrix1_2, matrix1_3, matrix1_4)
lowerlist2 = list(matrix2_1, matrix2_2, matrix2_3, matrix2_4)
lowerlist3 = list(matrix3_1, matrix3_2, matrix3_3, matrix3_4)
toplist = list(lowerlist1, lowerlist2, lowerlist3)

newmatrix1 = rbind(matrix1_1, matrix2_1, matrix3_1)
newmatrix2 = rbind(matrix1_2, matrix2_2, matrix3_2)
newmatrix3 = rbind(matrix1_3, matrix2_3, matrix3_3)
newmatrix4 = rbind(matrix1_4, matrix2_4, matrix3_4)
newtoplist = list(newmatrix1, newmatrix2, newmatrix3, newmatrix4)

Можно ли это сделать вообще?


person NWPhy    schedule 01.03.2015    source источник
comment
stackoverflow.com/ вопросы/5963269/   -  person Metrics    schedule 01.03.2015
comment
Извините, Хашаа, я хочу присоединиться к матрицам со всего верхнего уровня, а не к спискам нижнего уровня.   -  person NWPhy    schedule 01.03.2015
comment
Все матрицы одной размерности? Вы должны предоставить воспроизводимый ex.   -  person Khashaa    schedule 01.03.2015
comment
Все матрицы имеют одинаковое количество столбцов, но могут иметь разное количество строк в моем конкретном приложении.   -  person NWPhy    schedule 01.03.2015


Ответы (2)


Если вы не можете использовать mapply из ответа @Metrics (когда у вас слишком много элементов lowerlist для записи), что-то вроде этого может сработать. Я использовал magrittr для удобства чтения.

n <- length(toplist)
k <- sapply(toplist, length)[1] #assuming that each sublist contains the same number of matrices
num <- seq(1, n*k, by = n)
unlist(toplist, recursive = F) %>% 
    split(., num) %>% 
    lapply(., function(x) do.call(rbind,x))
person Khashaa    schedule 01.03.2015
comment
Кажется, это помогает. Для моего приложения количество записей списка в топлисте может варьироваться, а не фиксированное число, которое я указал выше. Спасибо за это. - person NWPhy; 01.03.2015

person    schedule
comment
Это работает здесь, хотя в моем реальном приложении у меня есть различное количество записей топлиста, которые нельзя жестко закодировать. - person NWPhy; 01.03.2015
comment
Вы имеете в виду, что количество нижних списков велико. - person Metrics; 01.03.2015
comment
Ну, не обязательно большой - на самом деле он соответствует количеству ядер процессора, на котором я запускаю функцию, используя пакет parallel. - person NWPhy; 01.03.2015
comment
stackoverflow.com/ вопросы/8827437/ могут работать - person Metrics; 01.03.2015
comment
Попробуйте добавить объяснение, почему это хорошее решение. Одна строка кода выглядит как ответ низкого качества и попала в очередь на проверку сообщений низкого качества. - person Benjamin; 02.03.2015
comment
@Benjamin: решение говорит само за себя на ваш вопрос. - person Metrics; 02.03.2015
comment
@Metrics Я не понимаю, что ты имеешь в виду? Должен ли я повторно отметить как некачественный и удалить свой комментарий к вам? - person Benjamin; 02.03.2015
comment
@Benjamin: Интересно, что заставляет вас думать, что одна строка кода выглядит как низкое качество, если она решает данную проблему OP. Пожалуйста, не стесняйтесь воспользоваться своим правом. - person Metrics; 02.03.2015
comment
@Metrics: Просто пытаюсь услышать от вас, прежде чем согласиться с флагом низкого качества. Поскольку вы не согласны, я оставлю все как есть, пусть решат другие. - person Benjamin; 02.03.2015