如何准确保存并恢复数值矩阵,使identical()判定二者完全相同?
让矩阵保存恢复后
identical()返回TRUE的解决方法 核心原因
identical()会严格比对对象的所有细节,包括数值的二进制存储形式、属性、数据类型等;而all.equal()是近似比对,默认忽略微小的浮点数精度差异。你遇到的问题本质是:用默认参数的write.table()存储时,浮点数的有效数字被截断,导致读取后的数值与原始值的二进制表示不完全一致。
解决方案
方案1:使用R原生二进制存储(推荐)
二进制格式会完整保留对象的所有信息,不会损失精度,是最可靠的方式:
options(digits = 10) data <- c(1/11, 1/22, 1/33, 1/44, 1/55, 1/66, 1/77, 1/88, 1/99) x <- matrix(data, nrow = 3, ncol = 3, byrow = TRUE) # 用saveRDS保存单个对象 saveRDS(x, "test.rds") # 读取对象 y <- readRDS("test.rds") identical(x, y) # 返回TRUE all.equal(x, y) # 返回TRUE unlink("test.rds")
也可以用save()和load(),但saveRDS()更适合单独存储一个对象,避免引入环境中的其他变量。
方案2:强制文本存储保留足够精度
如果必须用CSV等文本格式,需要在写入时指定足够多的有效数字(双精度浮点数需要至少17位有效数字才能完整保留精度):
options(digits = 10) data <- c(1/11, 1/22, 1/33, 1/44, 1/55, 1/66, 1/77, 1/88, 1/99) x <- matrix(data, nrow = 3, ncol = 3, byrow = TRUE) # 写入时设置digits=17,确保完整保留浮点数精度 write.table(x, "test.csv", digits = 17) y <- as.matrix(read.table("test.csv")) y <- unname(y) identical(x, y) # 返回TRUE all.equal(x, y) # 返回TRUE unlink("test.csv")
内容的提问来源于stack exchange,提问作者Frank KKK
相关产品推荐
相关产品推荐

