R语言代码执行出现integer overflow导致NA,请问问题根源是什么?
K-mer基因组大小计算中的R整数溢出问题
问题描述
我按照相关教程操作,使用指定文件运行以下R代码时,出现整数溢出(integer overflow)并生成NA:
spec1_25 <- read.table("spec1_25mer.histo") plot(spec1_25[5:200,],type="l") points(spec1_25[16:200,]) sum(as.numeric(spec1_25[16:10000,1]*spec1_25[16:10000,2])) [1] NA Warning message: In spec1_25[16:10000, 1] * spec1_25[16:10000, 2] : NAs produced by integer overflow
问题原因
R默认使用32位整数类型,其取值上限约为21亿。当spec1_25数据中第1列和第2列的数值相乘结果超过这个上限时,就会触发整数溢出,直接生成NA。
解决方法
方法1:用64位整数加载数据
先安装并加载bit64包,读取数据时指定64位整数类型,支持更大的数值范围:
# 安装包(仅第一次需要) install.packages("bit64") library(bit64) # 读取数据时指定列类型 spec1_25 <- read.table("spec1_25mer.histo", colClasses = c("integer64", "integer64")) # 重新执行计算 sum(spec1_25[16:10000,1] * spec1_25[16:10000,2])
方法2:计算前转换为浮点型
无需额外包,将其中一列转换为numeric(浮点型)后再相乘,浮点型的数值范围远大于32位整数:
spec1_25 <- read.table("spec1_25mer.histo") # 将第二列转成numeric后再计算 sum(spec1_25[16:10000,1] * as.numeric(spec1_25[16:10000,2]))
内容的提问来源于stack exchange,提问作者user3523406
相关产品推荐
相关产品推荐

