2015-07-20 83 views
0

我有這樣write.csv節省怪異值

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命令添加了一些小數。發生什麼事情了?

+1

指定'',''既是分隔符又是小數點 –

+0

爲什麼不使用'read.csv()'? – zx8754

+0

值沒有改變。默認情況下,'print'輸出數字值的7位數字。另外,尾隨零被切斷。因此,你只能從「-0.310400000000001 ...」中看到「-0.3104」。您可以通過調用'options(「digits」= 22)''將打印的位數改爲22。 – lukeA

回答

0

您的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

但差別應該是-0.3等等。爲什麼'R'改變了? – nelakell

+0

不同之處在於浮點運算。看到這個[post](http://stackoverflow.com/questions/6874867/floating-point-issue-in-r) – phiver

+0

非常感謝@phiver。 – nelakell