You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言feather包是否支持64位整数?

问题解答:R中Feather包对64位整数的支持问题

首先明确:Feather格式原生支持64位整数类型,但R的feather包目前对bit64包定义的integer64向量处理不完善,才会出现你遇到的精度丢失问题。

原因分析

当你写入bit64::integer64类型的列时,feather::write_feather()并没有识别出这是64位整数类型,而是将其当作普通数值类型处理,进而转成64位浮点数(double)。而浮点数无法精确表示所有64位整数,尤其是较大的数值,最终导致读回时精度丢失。

解决方案

这里有两种可行的方法,不需要将列转为字符类型:

方法1:使用arrow包替代feather包

arrow包是Feather格式的官方实现(Feather属于Apache Arrow项目的一部分),它原生支持bit64::integer64类型,能完美保留64位整数精度:

requireNamespace("bit64")
requireNamespace("arrow")

path <- base::tempfile(fileext = ".feather")
ds <- tibble::tibble(
  patient_id = bit64::as.integer64(1:6)
)

# 用arrow写入Feather文件
arrow::write_feather(ds, path)
# 读回数据
ds_read <- arrow::read_feather(path)

# 检查类型和数值
ds_read$patient_id
# # A tibble: 6 x 1
#  patient_id
#  <int64>
# 1          1
# 2          2
# 3          3
# 4          4
# 5          5
# 6          6

as.integer(ds_read$patient_id)
# [1] 1 2 3 4 5 6
unlink(path)

方法2:手动指定列类型(仅当必须使用feather包时)

如果你因为某些原因必须使用旧的feather包,可以先将integer64类型转换为Feather能识别的原生64位整数类型,需要借助vctrs包构造正确的类型:

requireNamespace("bit64")
requireNamespace("feather")
requireNamespace("vctrs")

path <- base::tempfile(fileext = ".feather")
ds <- tibble::tibble(
  patient_id = bit64::as.integer64(1:6)
)

# 将bit64的integer64转换为vctrs定义的int64类型
ds$patient_id <- vctrs::new_integer64(as.integer(ds$patient_id))

# 写入和读回数据
feather::write_feather(ds, path)
ds_read <- feather::read_feather(path)

# 检查结果
ds_read$patient_id
# # A tibble: 6 x 1
#  patient_id
#  <int64>
# 1          1
# 2          2
# 3          3
# 4          4
# 5          5
# 6          6
unlink(path)

总结

推荐优先使用arrow包,因为它是Feather格式的官方维护实现,对64位整数的支持更完善,同时还能提供更好的性能和更多扩展功能。旧的feather包已经不再积极维护,正逐步被arrow包替代。

内容的提问来源于stack exchange,提问作者wibeasley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:53:56