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
相关产品推荐
相关产品推荐

