R中的feather包可以支持64位整数吗?
将dataset传递给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。
发布于 2019-10-19 09:01:25
它实际上是“复杂的”。您可能知道,R本身只有两种类型:32位整数和64位双精度。
因此,为了表示64位整数,Jens在他的bit64包中做了相当多的工作,使用double作为64位有效负载的“载体”,并重新定义所有访问器功能,将其视为64位(有符号)整数。这是可行的。
有几个包本身就支持它,例如data.table。我在创建nanotime时利用了这一点--它使用64位整数表示纳秒。这也是可行的:我们永远不会在两者之间转换为double,并获得忠实的integer64表示。
多年来,我也一直在关注reticulate,它有非常类似的64位整数转换问题(因为它们是Python语言中的原生整数),现在通常已经解决了这些问题。
长话短说:你的问题更多的是对feather的特性请求。随着相关人员现在关注似乎具有64位整数支持的arrow,您很可能会被要求迁移到arrow。或者你可以使用data.table。
https://stackoverflow.com/questions/58459234
复制相似问题