big.matrix作为R中的data.frame

时间:2011-11-29 18:12:56

标签: r dataframe ranking ehcache-bigmemory r-bigmemory

我最近开始使用R进行数据分析。现在我在排序一个大的查询数据集时遇到了问题(在ASCII模式下约为1 GB,在我的笔记本电脑的二进制模式下的4GB RAM中)。对此数据集使用bigmemory::big.matrix是一个不错的解决方案,但在gbm()randomForest()算法中提供此类矩阵“m”会导致错误:

cannot coerce class 'structure("big.matrix", package = "bigmemory")' into a data.frame

class(m)输出以下内容:

[1] "big.matrix"
attr(,"package")
[1] "bigmemory"

有没有办法将big.matrix实例正确传递给这些算法?

2 个答案:

答案 0 :(得分:11)

我显然无法使用您的比例数据对此进行测试,但我可以使用每个函数的公式接口重现您的错误:

require(bigmemory)
m <- matrix(sample(0:1,5000,replace = TRUE),1000,5)
colnames(m) <- paste("V",1:5,sep = "")

bm <- as.big.matrix(m,type = "integer")

require(gbm)
require(randomForest)

#Throws error you describe
rs <- randomForest(V1~.,data = bm)
#Runs without error (with a warning about the response only having two values)
rs <- randomForest(x = bm[,-1],y = bm[,1])

#Throws error you describe
rs <- gbm(V1~.,data = bm)
#Runs without error
rs <- gbm.fit(x = bm[,-1],y = bm[,1])

不使用randomForest的公式接口对于大型数据集来说是相当常见的建议;它可能效率很低。如果您阅读?gbm,您会看到类似的建议,也会引导您转向gbm.fit大数据。

答案 1 :(得分:2)

通常情况下,数字对象占用的内存大于磁盘空间。向量或矩阵中的每个“double”元素占用8个字节。当您将对象强制转换为data.frame时,可能需要将其复制到RAM中。您应该避免尝试使用bigmemory / big ***套件支持的函数和数据结构。 “biglm”可用,但我怀疑你可以期待gbm()或者randomForest()来识别和使用“大”家庭中的设施。