【问题标题】:write.csv saves weird valueswrite.csv 保存奇怪的值
【发布时间】:2015-07-20 11:58:20
【问题描述】:

我有一个这样的数据集

data <- data.frame(Time=as.Date(c("2007-01-31", "2007-02-28", "2007-03-31", 
        "2007-04-30", "2007-05-31"), format="%Y-%m-%d"), 
        a=c(104.8587, 104.5483, 104.0210, 105.7185, 104.9054), 
        b=c(95.4, 95.9, 95.6, 95.5, 95.8))


> data
    Time        a    b
1 2007-01-31 104.8587 95.4
2 2007-02-28 104.5483 95.9
3 2007-03-31 104.0210 95.6
4 2007-04-30 105.7185 95.5
5 2007-05-31 104.9054 95.8

被使用

ddata <- data.frame(diff(as.matrix(data[,-1])))
ddata$Time <- data[-1,1]
ddata <- ddata[c(3, 1:2)]

接受差异。

> ddata
    Time       a    b
1 2007-02-28 -0.3104  0.5
2 2007-03-31 -0.5273 -0.3
3 2007-04-30  1.6975 -0.1
4 2007-05-31 -0.8131  0.3

然后我使用write.csv(ddata, file="ddata.csv", row.names=FALSE) 将其保存到 csv 文件中。但是,如果我重新加载它,值就会改变。

> ddata <- read.table(file="ddata.csv", dec=",", header=T, sep=",")
> ddata
    Time                  a                   b
1 2007-02-28 -0.310400000000001                 0.5
2 2007-03-31 -0.527299999999997  -0.300000000000011
3 2007-04-30   1.69750000000001 -0.0999999999999943
4 2007-05-31 -0.813100000000006   0.299999999999997

四舍五入的值仍然相同,但write.csv 命令添加了一些小数。发生什么事情了?

【问题讨论】:

  • 您将"," 指定为分隔符和小数点
  • 为什么不使用read.csv()
  • 值没有改变。默认情况下,print 输出 7 位数值。此外,尾随零被删除。因此,您只能从-0.310400000000001... 看到-0.3104。您可以通过调用options("digits" = 22) 将打印的位数更改为 22。
  • 谢谢@docendodiscimus 这解决了问题,虽然我仍然没有得到 csv 文件中的多余数字。

标签: r csv export-to-csv


【解决方案1】:

您的 write.csv 操作按原样导出数据,尽管略微四舍五入。

如果您将数字设置为 20,您会发现您认为的 -0.3 实际上是 -0.300000000000011369。

options(digits = 20)
ddata
    Time                    a                     b
1 2007-02-28 -0.31040000000000134  0.500000000000000000
2 2007-03-31 -0.52729999999999677 -0.300000000000011369
3 2007-04-30  1.69750000000000512 -0.099999999999994316
4 2007-05-31 -0.81310000000000571  0.299999999999997158

【讨论】:

  • 但差异应该是-0.3等等。为什么R改变这个?
  • 差异是由浮点运算引起的。看到这个post
  • 非常感谢@phiver。
猜你喜欢
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多