Как преобразовать список в матрицу более эффективно в R?
У меня есть список длиной 130,000, где каждый элемент-это вектор символов длиной 110. Я бы хотел, чтобы преобразовать этот список в матрицу с размером 1,430,000*10. Как я могу сделать это более эффективно?
Мой код :
output=NULL
for(i in 1:length(z)) output=rbind(output,matrix(z[[i]],ncol=10,byrow=T))
4 ответов:
Это должно быть эквивалентно вашему текущему коду, только намного быстрее:
output <- matrix(unlist(z), ncol = 10, byrow = TRUE)
Я думаю вы хотите
output <- do.call(rbind,lapply(z,matrix,ncol=10,byrow=TRUE))т. е. объединение @BlueMagister в использовании
do.call(rbind,...)Сlapplyзаявление для преобразования отдельных элементов списка в 11*10 матриц ...критерии (показать @flodel это
unlistрешение в 5 раз быстрее, чем у меня, и в 230x быстрее, чем оригинальный подход ...)n <- 1000 z <- replicate(n,matrix(1:110,ncol=10,byrow=TRUE),simplify=FALSE) library(rbenchmark) origfn <- function(z) { output <- NULL for(i in 1:length(z)) output<- rbind(output,matrix(z[[i]],ncol=10,byrow=TRUE)) } rbindfn <- function(z) do.call(rbind,lapply(z,matrix,ncol=10,byrow=TRUE)) unlistfn <- function(z) matrix(unlist(z), ncol = 10, byrow = TRUE) ## test replications elapsed relative user.self sys.self ## 1 origfn(z) 100 36.467 230.804 34.834 1.540 ## 2 rbindfn(z) 100 0.713 4.513 0.708 0.012 ## 3 unlistfn(z) 100 0.158 1.000 0.144 0.008если это масштабируется соответствующим образом (т. е. вы не сталкиваетесь с проблемами памяти), полная проблема займет около 130 * 0,2 секунды = 26 секунды на сопоставимой машине (я сделал это на 2-летнем MacBook Pro).
это поможет иметь пример информации о вашем выходе. Рекурсивно, используя
rbindна все большие и большие вещи это не рекомендуется. Моя первая догадка о чем-то, что поможет вам:z <- list(1:3,4:6,7:9) do.call(rbind,z)посмотреть вопрос для большей эффективности, если это необходимо.
Comments