feather 中的 64 位整数支持

64-bit integer support in feather

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

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

这是一个简化的例子。在实际项目中,数据库 table(使用 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

其实是"complicated"。你可能知道,R 本身只有两种类型:32 位整数和 64 位双精度。

因此,为了表示 64 位整数,Jens 在他的 bit64 包中做了很多工作,将 double 用作 64 位有效负载的 "carrier" 并重新定义了所有访问器功能来处理它与 64 位(带符号)整数一样。这样可行。

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

这些年来我也一直在关注 reticulate,它与 64 位整数(因为它们在 Python 中是原生的)有非常相似的转换问题,这些问题现在已经得到普遍解决。

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