Ответ 1
Это должно быть эквивалентно вашему текущему коду, только намного быстрее:
output <- matrix(unlist(z), ncol = 10, byrow = TRUE)
У меня есть список длиной 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))
Это должно быть эквивалентно вашему текущему коду, только намного быстрее:
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 раз быстрее, чем мое, и в 230 раз быстрее, чем исходный подход...)
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 секунд на сопоставимой машине (я сделал это на двухлетнем MacBook Pro).
Это поможет получить пробную информацию о вашем выходе. Рекурсивно использовать rbind
для больших и больших вещей не рекомендуется. Мое первое предположение о том, что вам поможет:
z <- list(1:3,4:6,7:9)
do.call(rbind,z)
См. связанный вопрос для большей эффективности, если это необходимо.
Вы также можете использовать,
output <- as.matrix(as.data.frame(z))
Использование памяти очень похоже на
output <- matrix(unlist(z), ncol = 10, byrow = TRUE)
Что можно проверить, с mem_changed()
из library(pryr)
.
вы можете использовать as.matrix, как показано ниже:
output <- as.matrix(z)