的源代码nnet::class.ind
是:
function (cl) {
n <- length(cl)
cl <- as.factor(cl)
x <- matrix(0, n, length(levels(cl)))
x[(1L:n) + n * (unclass(cl) - 1L)] <- 1
dimnames(x) <- list(names(cl), levels(cl))
x
}
.Machine$integer.max
是 2147483647。如果n*(nlevels - 1L)
大于这个值,应该会产生你的错误。解决n
:
imax <- .Machine$integer.max
nlevels <- 5000
imax/(nlevels-1L)
## [1] 429582.6
如果您有 429583 或更多行(对于数据挖掘上下文而言不是特别大),您将遇到此问题。如上所述,如果您的建模框架可以处理稀疏矩阵,则使用(or ) 会做得更好。或者,您必须重写以避免此瓶颈(即按行和列而不是按绝对位置进行索引)[@joran 上面评论 R 通过双精度值索引大向量,因此您可能能够逃脱只是破解那条线Matrix::sparse.model.matrix
Matrix::fac2sparse
class.ind
x[(1:n) + n * (unclass(cl) - 1)] <- 1
可能在as.numeric()
此处或此处添加显式以强制强制加倍...]
即使你能够完成这一步,你最终也会得到一个 5000*650000 的矩阵——看起来这将是 12Gb。
print(650*object.size(matrix(1L,5000,1000)),units="Gb")
我想如果你有 100Gb 的免费空间就可以了......