Можете ли вы построить свои матрицы только с числовыми переменными и преобразовать в коэффициент в конце? rbind
намного быстрее на числовых матрицах.
В моей системе, используя фреймы данных:
> system.time(result<-do.call(rbind, someParts))
user system elapsed
2.628 0.000 2.636
Построение списка со всеми числовыми матрицами вместо:
onerowdfr2 <- matrix(as.numeric(onerowdfr), nrow=1)
someParts2<-lapply(rbinom(200, 1, 14/200)*6+1,
function(reps){onerowdfr2[rep(1, reps),]})
результаты намного быстрее rbind
.
> system.time(result2<-do.call(rbind, someParts2))
user system elapsed
0.001 0.000 0.001
РЕДАКТИРОВАТЬ: Вот еще одна возможность; он просто объединяет каждый столбец по очереди.
> system.time({
+ n <- 1:ncol(someParts[[1]])
+ names(n) <- names(someParts[[1]])
+ result <- as.data.frame(lapply(n, function(i)
+ unlist(lapply(someParts, `[[`, i))))
+ })
user system elapsed
0.810 0.000 0.813
Все же не так быстро, как при использовании матриц.
РЕДАКТИРОВАТЬ 2:
Если у вас есть только цифры и коэффициенты, нетрудно преобразовать все в числовые значения, rbind
, и преобразовать необходимые столбцы обратно в коэффициенты. Это предполагает, что все факторы имеют одинаковые уровни. Преобразование в множитель из целого числа также происходит быстрее, чем из числового значения, поэтому сначала я делаю целое число.
someParts2 <- lapply(someParts, function(x)
matrix(unlist(x), ncol=ncol(x)))
result<-as.data.frame(do.call(rbind, someParts2))
a <- someParts[[1]]
f <- which(sapply(a, class)=="factor")
for(i in f) {
lev <- levels(a[[i]])
result[[i]] <- factor(as.integer(result[[i]]), levels=seq_along(lev), labels=lev)
}
Время в моей системе:
user system elapsed
0.090 0.00 0.091