将小整数写入R中的二进制文件

时间:2011-08-10 18:49:54

标签: r

我有一个关于在R中写入二进制文件的问题。我正在进行数据压缩,我想写一个二进制文件整数,可以用两个字节表示,但R代表它们在4个字节上。是否有任何数据类型可以存储两个字节或一个字节的数字(如C中的短整数)?

如果没有,当你使用带有小整数的writeBin(例如可以保存为1个字节)和size = 1时,程序是否写入整数的所有4个字节(包括0个字节)或者它转换它到1个字节。

这对我来说是一个非常重要和紧迫的问题,我们将非常感谢您的帮助。如果您知道有关写入二进制文件的全面帮助,请告诉我们。谢谢!

(有时,当我使用大小等于小数字的writeBin时,我得到一个错误,说明我的机器上没有定义大小。我该如何解决这个问题?将整数写入压缩文件的最佳方法是什么?目的(拥有最小的文件)?原始数据类型有帮助吗?)

2 个答案:

答案 0 :(得分:2)

你可能会让你的生活变得太复杂。 R在save()默认使用压缩,你测量的还不够好吗?一个例子:

R> vec <- rep(1L, 100)                 ## 100 integer elements
R> object.size(vec) 
440 bytes                              ## so there must be a 40 byte overhead
R> str(vec)
 int [1:100] 1 1 1 1 1 1 1 1 1 1 ...
R> save( vec, file="/tmp/vec.RData")
R> file.info("/tmp/vec.RData")[1:3]
               size isdir mode
/tmp/vec.RData   64 FALSE  644         ## stored to 64 bytes!
R> 

您可能会认为重复值非常适合压缩,但它们甚至可能适用于您的数据集?

否则,可以尝试支持单字节和双字节类型的CRAN包ff

最后,如果您想要完全控制,可以使用C或C ++分配更短的整数类型,甚至是char类型。有package I could recommend for interfacing C++ ...

答案 1 :(得分:0)

对于整数,writeBin的size参数应为1,2或4 - 8也适用于压缩;-)

真的需要size = 3吗?

writeBin会写入整数值,每个整数的字节数与指定的一样多。如果整数不合适,则会以静默方式跳过高位。

对于签名值(默认值):

size=1 for integer values between [-128, 127]
size=2 for integer values between [-32768, 32767]

或者,如果你用signed = FALSE读取它们:

size=1 for integer values between [0, 255]
size=2 for integer values between [0, 65535].

为指定大小写入太大值的示例:

writeBin(254:257, "foo.bin", size=1)
readBin("foo.bin", "int", 4, size=1, signed=FALSE) # 254 255 0 1