羽毛中的64位整数支持

时间:2019-10-18 23:25:01

标签: r int64 feather

R中的feather软件包可以支持64位整数吗?

将数据集传递到feather::write_feather()时,该列将转换为64位浮点数,并且会失去精度。我想避免将其转换为字符。

这是一个简化的示例。在实际的项目中,数据库表(使用odbc软件包检索)具有合法的64位整数列(如bit64软件包中指定的列)。

requireNamespace("bit64")

path <- base::tempfile(fileext = ".feather")

ds <-
  tibble::tibble(
    patient_id   = bit64::as.integer64(1:6)
  )
ds

# # A tibble: 6 x 1
#   patient_id
#   <int64>   
# 1 1         
# 2 2         
# 3 3         
# 4 4         
# 5 5         
# 6 6 

feather::write_feather(x = ds, path = path)

ds_read <- feather::read_feather(path)
# # A tibble: 6 x 1
#    patient_id
#         <dbl>
# 1 Inf.Nae-324
# 2 Inf.Nae-324
# 3   1.50e-323
# 4   2.00e-323
# 5   2.50e-323
# 6   3.00e-323


as.integer(ds_read$patient_id)
# Returns: [1] 0 0 0 0 0 0

unlink(path_out)

注意:我不想将它们存储为浮点数,as suggested here

1 个答案:

答案 0 :(得分:1)

它实际上是“复杂的”。您可能知道,R本身只有两种类型:32位整数和64位double。

为了表示64位整数,Jens在其bit64包中做了很多工作,将double用作64位有效载荷的“载体”,并重新定义了所有访问器功能,将其视为64位有效载荷。位(有符号)整数。这样可行。

几个软件包本身都支持它,例如data.table。我创建nanotime时就利用了这一点-自时代起,它使用64位整数纳秒。这也行得通:我们永远不会在两者之间转换为double并获得忠实的integer64表示形式。

这些年来,我也一直关注reticulate,它在64位整数(如Python中固有的整数)中的转换问题非常相似,目前已得到普遍解决。

长话短说:您的问题更多是针对feather的功能请求。并且由于相关人员现在关注arrow,它似乎具有64位整数支持,因此很可能会要求您转到arrow。或者,您可以使用data.table