我正在寻找一种以更紧凑的方式存储数据帧数字向量的方法。
我使用来自家庭调查的数据(巴西的PNAD),观察到约400,000和约200个问题。导入后,数据在R中使用~500Mb的内存,但在Stata中仅使用180Mb。这是因为有一个'压缩'在Stata中的命令,它将查看每个变量(向量)的内容并将其强制转换为最紧凑的类型。例如,仅包含1到100之间整数的双数字变量(8字节)将被转换为"字节" type(小int)。它对字符串变量(向量)执行类似操作,将变量字符串大小减小到其最大元素的大小。
我知道我可以使用' colClasses' read.table函数中的参数并显式声明类型(as here)。但这很耗时,有时调查文档不会明确表示超出数字与字符串的类型。此外,我知道这些天500Mb并不是世界末日,但是不同年份的追加调查开始变得越来越大。
我很惊讶我在R中找不到相同的东西,这也是内存受限(我知道内存不可能,但更复杂)。怎么会有3倍的内存增益?
稍后阅读,我的问题归结为:
1)为什么没有一个"字节" R中的原子矢量类型? )这可用于存储小整数(从-127到100,如在Stata中)和逻辑(如this SO question中所讨论的。)这将非常有用,因为调查通常包含许多小int值的问题(年龄)另外,SO问题提到了#bit;包,对于1位逻辑,但由于失去NA值,这有点过于极端。实现新的原子类型并预测然而,更广泛的后果远远高于我的联盟。
2)是否有相应的命令来压缩'在R? (here是一个类似的SO问题)。
如果没有命令,我编写了下面的代码,强制包含存储为"双倍"的整数的向量。整数。这样可以减少这些向量的内存分配,而不会丢失任何信息。
compress <- function(x){
if(is.data.frame(x)==TRUE){
for(i in 1:ncol(x)){
if(sum(!(x[,i] == as.integer(x[,i])))==0){
x[,i] <- as.integer(x[,i])
}
}
}
return(x)
}
object.size(mtcars) # output 6736 bytes
object.size(compress(mtcars)) # output 5968 bytes
此次转换是否存在风险? 在使此代码更有效的过程中,也可以获得帮助。