数据文件data.dat:

5625010350032.36719 5627008621379.12591 5628763999478.55791 5630383772880.98831 5632384688238.96095 5633992371569.87936 5635830220975.76879 5637713568911.67183 5639436594135.51215 5641160625591.58400 5643072053703.23919 5644920788572.33232 5646668772882.99855 5648398453919.33759 5650178043246.84799 5651842484825.03887 5653671759113.42399 5655374735235.55599 5657184594518.72287 5658951103084.33839 5660687853998.58127 5662491073242.24399 

下面的代码

x1 <- data.matrix(data.table::fread("data.dat")) # Read it
plot(x1[1,])                                     
data.table::fwrite(x=x1, file="xout.dat", sep=" ") # Write it 
x2 <- data.matrix(data.table::fread("xout.dat"))   # Read it again
lines(x2[1,], col='red')

显示元素x2[1,13]接受值2.7898250541260385e-311,而实际上它应该等于x1[1,13].是什么导致引入垃圾值?

data.dat个文件是从C++文件中按以下方式编写的

    std::ofstream file("data.dat", std::ios::out);
    file << std::setprecision(std::numeric_limits<long double>::digits10) << std::showpoint;
    for (size_t i = 0; i < v.size(); ++i)
        file << v[i] << " ";
    file << std::endl;

其中,向量v包含写入data.dat的值.我在使用数据.表1.14.2版和R 4.1.3版.

推荐答案

很明显,它在过程中的某个地方进行了一些舍入,fread将第13个值存储为integer64 "integer64" (default) reads columns detected as containing integers larger than 2^31 as type bit64::integer64.

enter image description here

你能做的就是强迫它被解释为数字,把colClasses = c("numeric")加到你的fread中.

x2 <- data.matrix(data.table::fread("xout.dat", colClasses = c("numeric")))

这不会防止浮点问题,但不会完全更改第13个值.

如果我们现在做x1-x2,我们看到所有的值都有相同的差异.

x1-x2

#              V1         V2         V3         V4         V5          V6          V7        V8        V9       V10         V11       V12
# [1,] -0.0029297 -0.0039062 -0.0019531 -0.0019531 0.00097656 -0.00097656 -0.00097656 0.0019531 0.0019531 0.0039062 -0.00097656 0.0019531
#              V13        V14        V15         V16       V17        V18       V19         V20        V21       V22
# [1,] -0.00097656 -0.0019531 -0.0019531 -0.00097656 0.0039062 -0.0039062 0.0029297 -0.00097656 0.00097656 0.0039062

R相关问答推荐

如何判断某列中由某些行组成的百分比

跨列应用多个摘要函数:summerise_all:列表对象无法强制为double类型'

如何在四进制仪表板值框中显示值(使用shiny 的服务器计算)

如何按排序顺序打印一个框架中所有精确的唯一值?

如何计算前一行的值,直到达到标准?

如果行和大于值,则过滤

ggplot2中的X轴显示数值,单位为百,而不是十

如何在kableextra调用cell_spec()中忽略NA?

为什么舍入POSIXct会更改能力以匹配等效的POSIXct?

传递ggplot2的变量作为函数参数—没有映射级别以正确填充美学

无法定义沿边轨迹的 colored颜色 渐变(与值无关)

根据1个变量绘制 colored颜色 发散的 map ,由另一个变量绘制饱和度,ggplot2不工作

使用RSelenium在R中抓取Reddit时捕获多个标签

在R中创建连续的期间

防止正则表达式覆盖以前的语句

如何在访问之前下载的输入时同时上传和处理所有指定的shiny 输入?

如何创建直方图与对齐的每月箱?

使用显式二元谓词子集化sfc对象时出错

如何在R曲线图弹出窗口中更改r和theta标签

如何在给定的环境中找到函数的函数参数?