R语言中integer64类型列转integer/numeric失败如何解决
R中integer64类型列转换为普通数值类型的解决方法
问题原因
integer64是bit64包提供的64位整数自定义类型,基础R的默认as.numeric、as.integer函数没有适配该类型的转换方法,直接调用只会返回底层存储的异常值,无法得到正确的原始数值。
近期自动出现该问题大概率是你使用的读数据函数(如data.table的fread)版本更新后默认将大整数字段识别为integer64类型,或是运行时意外加载了bit64包触发了类型自动识别。
解决方法
方法1:转换指定列
加载bit64包后调用对应类型的转换方法,针对你样例中的export_value列,转换代码如下:
library(bit64) library(data.table) # 单字段转换为numeric my_data3[, export_value := as.numeric(export_value)] # 如果不需要保留精度也可以转成integer # my_data3[, export_value := as.integer(export_value)]
方法2:批量转换所有integer64列
如果数据中有多个integer64类型的列,可以一次性批量转换:
my_data3 <- my_data3[, lapply(.SD, function(col) { if (inherits(col, "integer64")) { return(as.numeric(col)) } return(col) })]
如果使用dplyr语法,批量转换代码如下:
library(dplyr) library(bit64) my_data3 <- my_data3 %>% mutate(across(where(is.integer64), as.numeric))
方法3:从源头避免生成integer64类型(推荐)
读入数据时直接指定integer64的解析规则,就不会再生成该类型:
# 使用fread读入时加integer64参数,直接解析为numeric my_data3 <- fread("你的数据文件路径.csv", integer64 = "numeric")
验证方法
转换完成后运行以下代码验证类型是否正确:
class(my_data3$export_value) # 正确输出应为 "numeric" 或 "integer"
注意:如果你的数值大于2^31-1(普通integer的最大值),不要转换为integer类型,否则会出现溢出错误,建议保留为numeric类型。
内容的提问来源于stack exchange,提问作者Mels
相关产品推荐
相关产品推荐

