如何使用readr读取极小科学计数法数值并保留原始精度
问题原因
你遇到的问题本质是R默认双精度浮点型的存储限制:双精度浮点数可表示的最小正有限值约为2.2e-308,所有小于该阈值的数值都会被自动下溢为接近该阈值的近似值,和readr工具本身无关。
可行解决方案
方案1:将P值列读取为字符串保留原始值
如果后续只需要展示、匹配原始P值文本,不需要做数值运算,直接在读入时指定P值列为字符型即可:
infile <- "~/Desktop/test.csv" # 把第二列的类型从d(双精度)改成c(字符) dat <- readr::read_delim(infile, delim = "\t", col_types = "cc")
这种方式会完全保留文件里的原始数值文本,不会出现精度损失。
方案2:使用任意精度数值类型存储
如果后续需要对极小P值做数值计算,可以读取为字符后转成高精度数值类型,借助Rmpfr包即可实现:
# 先安装加载包 install.packages("Rmpfr") library(Rmpfr) infile <- "~/Desktop/test.csv" # 先读为字符 dat <- readr::read_delim(infile, delim = "\t", col_types = "cc") # 转成1024位精度的数值,足够存储极小P值 dat$`P-value` <- mpfr(dat$`P-value`, precBits = 1024)
转换后可以正常做数值比较、对数转换等运算,不会出现下溢问题。
内容的提问来源于stack exchange,提问作者littleworth
相关产品推荐
相关产品推荐

