2015-08-05 5 views
4

У меня есть матрица, и я хочу создать список с выбранными строками этой матрицы, являющимися элементами списка.R_List из выбранных строк матрицы

Например, это моя матрица

my.matrix=matrix(1:100, nrow=20) 

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

my.n=c(1,2,4,3,5,5) 

Так первый элемент в моем списке должен быть

my.matrix[1,] 

сек ond

my.matrix[2:3,] 

и так далее.

Как это сделать элегантным способом?

+0

my.n дает количество строк, которые должны быть извлечены из my.matrix. 'my.n [1] = 1' означает строку 1; 'my.n [2] = 2' означает строку 2,3; 'my.n [3] = 4' означает строки с 4 по 7 и т. Д. – user3420448

ответ

3

Не совсем уверен, но я думаю, что вы хотите что-то вроде этого ...

S <- split(seq_len(nrow(my.matrix)), rep.int(seq_along(my.n), my.n)) 
lapply(S, function(x) my.matrix[x, , drop = FALSE]) 

Здесь мы разделив число строк из my.matrix по репликаций my.n. Затем мы используем lapply() по результирующему списку S подмножеством my.matrix с этими номерами строк.

+0

Спасибо. Именно то, что я хотел. – user3420448

3
end <- cumsum(my.n) 
start <- c(1,(end+1)[-length(end)]) 
mapply(function(a,b) my.matrix[a:b,,drop=F], start, end) 

mapply принимает первый аргумент из двух векторов и применяет их к функции. Он переходит ко второму элементу каждого вектора и продолжается через каждый вектор. Это поведение работает для этого приложения, чтобы создать список подмножеств, как описано. кредит для @nongkrong для подхода mapply.

+0

Спасибо. Я делал что-то подобное и почти дошел до этого. Но я думаю, что использование 'split' перед' apply' функцией, как в @Richard Scriven, является более элегантным. – user3420448

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