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
.
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
.