2015-05-12 2 views
1

У меня есть матрица m, и я хочу преобразовать ее в список l, где каждый элемент списка является подматрицей m, состоящей из x строк из m.R: преобразовать матрицу в список подматриц

Как это:

m <- matrix(sample(15,60,T),12) 
l <- list(m[1:3,],m[4:6,],m[7:9,],m[10:12,]) 

Я уверен, что есть простое и более общее решение для этого, но все же нового для R я не могу найти его. Я думал об использовании, но не знаю, как это сделать. Любые указатели в правильном направлении были бы весьма полезны.

ответ

1

Просто проследовать, как вы делали в вашем вопросе, используя Map для итерации по индексу начала и окончания индекса:

p = 3 
Map(function(u,v) m[u:v,], seq(1,nrow(m),p), seq(p,nrow(m),p)) 

#[[1]] 
#  [,1] [,2] [,3] [,4] [,5] 
#[1,] 14 8 5 10 9 
#[2,] 10 4 5 7 8 
#[3,] 3 3 6 7 3 

#[[2]] 
#  [,1] [,2] [,3] [,4] [,5] 
#[1,] 4 8 12 1 1 
#[2,] 4 2 13 1 11 
#[3,] 6 2 4 1 12 

#[[3]] 
#  [,1] [,2] [,3] [,4] [,5] 
#[1,] 11 12 8 5 7 
#[2,] 3 6 2 6 2 
#[3,] 13 13 10 7 12 

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

Это работает отлично, спасибо! – Anca

2

Функция сплит очень полезно здесь:

lapply(split(m,rep(c(1:3),each=4)),matrix,nrow=4) 

Или в более общем плане,

n = 3 
lapply(split(m,rep(c(1:n),each=(nrow(m)/n))),matrix,nrow(m)/n) 
+0

Его немного ручной, вам не кажется? –

+0

Яркий, вы можете немного почистить его так: 'n <- 3; lapply (split (m, rep (c (1: n), each = (nrow (m)/n))), matrix, nrow (m)/n) ' –

+0

Спасибо, но это не делает именно то, что я хотеть. Он разбивает матрицу на n подматриц, а не на подматрицы с n строками. (Я знаю, что n можно легко адаптировать, чтобы соответствовать этому, но все еще немного сложнее, чем другой ответ.) – Anca

Смежные вопросы