0

R中的羽毛包可以支持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)

注意:我不想按照这里的建议将它们存储为浮点数。

4

1 回答 1

1

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

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

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

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

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

于 2019-10-19T01:01:24.983 回答