Этот сценарий, cbind
ИНГ кучу векторов, устанавливается идеально для сброса информации прямо в sparse, column-oriented матрицы (dgCMatrix
класса).
Вот функция, которая будет делать это:
sv.cbind <- function (...) {
input <- lapply(list(...), as, "dsparseVector")
thelength <- unique(sapply(input,length))
stopifnot(length(thelength)==1)
return(sparseMatrix(
x=unlist(lapply(input,slot,"x")),
i=unlist(lapply(input,slot,"i")),
p=c(0,cumsum(sapply(input,function(x){length([email protected])}))),
dims=c(thelength,length(input))
))
}
С быстрой проверки, это выглядит примерно в 10 раз быстрее, чем принуждение + cBind
:
require(microbenchmark)
xx <- lapply(1:10, function (k) {
sparseVector(x=rep(1,100), i=sample.int(1e4,100), length=1e4)
})
microbenchmark(do.call(sv.cbind, xx), do.call(cBind, lapply(xx,as,"sparseMatrix")))
# Unit: milliseconds
# expr min lq mean median uq max neval cld
# do.call(sv.cbind, xx) 1.398565 1.464517 1.540172 1.49487 1.55911 3.455421 100 a
# do.call(cBind, lapply(xx, as, "sparseMatrix")) 16.037890 16.356268 16.956326 16.59854 17.49956 20.256253 100 b
я могу ответить, но некоторые более необходимо руководство. Сохраняются ли эти векторы в любом разреженном формате? Например. вы сохраняете 'tc2 [[1]]' как числовой вектор с большим количеством 0s или используете разреженную матрицу для представления каждого вектора? Можете ли вы привести пример данных для работы? – Iterator
@DAF - Был ли мой ответ на вопрос, что вы спрашивали? Если это так, вы можете принять его, нажав галочку слева. Если нет, можете ли вы добавить пример типа разреженных векторов, который вы хотите объединить в разреженной матрице? Приветствия. –
@iterator - я могу сделать шаг назад и начать со списка «набора предметов», то есть каждая запись представляет собой список чисел, обозначающих элементы/слова, встречающиеся в строке. Я хотел бы иметь разреженное матричное представление этих данных. Решение Josh работает для небольших примеров, но на образце с 10K строк и 10k элементов у меня заканчивается память (16 G) – DAF